布局优化

支持自定义布局
This commit is contained in:
huanghaijie
2018-09-25 17:54:24 +08:00
parent 4fcdb590dd
commit 413d9b78a0
19 changed files with 196 additions and 111 deletions

View File

@@ -3,6 +3,9 @@ package com.hankkin.pagelayoutdemo
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import android.widget.ImageView
import com.hankkin.pagelayout.PageLayout import com.hankkin.pagelayout.PageLayout
import kotlinx.android.synthetic.main.activity_default.* import kotlinx.android.synthetic.main.activity_default.*
@@ -11,11 +14,15 @@ class DefaultActivity : AppCompatActivity() {
private val mPageLayout by lazy { private val mPageLayout by lazy {
PageLayout.Builder(this) PageLayout.Builder(this)
.initPage(ll_default) .initPage(ll_default)
.setOnRetryListener(object : PageLayout.OnRetryClickListener{ .setCustomView(layoutInflater.inflate(R.layout.layout_custom, null)
.apply {
//todo
findViewById<ImageView>(R.id.iv_custom).setImageResource(R.mipmap.icon_smile)
})
.setOnRetryListener(object : PageLayout.OnRetryClickListener {
override fun onRetry() { override fun onRetry() {
loadData() loadData()
} }
}) })
.create() .create()
} }
@@ -26,29 +33,33 @@ class DefaultActivity : AppCompatActivity() {
loadData() loadData()
empty.setOnClickListener {
mPageLayout.showEmpty()
}
error.setOnClickListener {
mPageLayout.showError()
}
loading.setOnClickListener {
mPageLayout.showLoading()
}
content.setOnClickListener {
mPageLayout.hide()
}
} }
private fun loadData(){ private fun loadData() {
mPageLayout.showLoading() mPageLayout.showLoading()
Handler().postDelayed({ Handler().postDelayed({
mPageLayout.hide() mPageLayout.hide()
},3000) }, 3000)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menus, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_loading -> loadData()
R.id.menu_empty -> mPageLayout.showEmpty()
R.id.menu_error -> mPageLayout.showError()
R.id.menu_content -> mPageLayout.hide()
R.id.menu_customer -> mPageLayout.showCustom()
else -> {
}
}
return super.onOptionsItemSelected(item)
} }
} }

View File

@@ -1,9 +1,12 @@
package com.hankkin.pagelayoutdemo package com.hankkin.pagelayoutdemo
import android.support.v7.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.widget.Toast import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import android.widget.ImageView
import android.widget.TextView
import com.hankkin.pagelayout.PageLayout import com.hankkin.pagelayout.PageLayout
import kotlinx.android.synthetic.main.activity_demo.* import kotlinx.android.synthetic.main.activity_demo.*
@@ -14,6 +17,12 @@ class DemoActivity : AppCompatActivity() {
.initPage(ll_demo) .initPage(ll_demo)
.setLoading(R.layout.layout_loading_demo,R.id.tv_page_loading_demo) .setLoading(R.layout.layout_loading_demo,R.id.tv_page_loading_demo)
.setEmpty(R.layout.layout_empty_demo,R.id.tv_page_empty_demo) .setEmpty(R.layout.layout_empty_demo,R.id.tv_page_empty_demo)
.setCustomView(layoutInflater.inflate(R.layout.layout_custom, null)
.apply {
//todo
findViewById<ImageView>(R.id.iv_custom).setImageResource(R.mipmap.icon_smile)
findViewById<TextView>(R.id.tv_custom_content).setText("This is PageLayout")
})
.setError(R.layout.layout_error_demo,R.id.tv_page_error_demo,object : PageLayout.OnRetryClickListener{ .setError(R.layout.layout_error_demo,R.id.tv_page_error_demo,object : PageLayout.OnRetryClickListener{
override fun onRetry() { override fun onRetry() {
loadData() loadData()
@@ -32,17 +41,6 @@ class DemoActivity : AppCompatActivity() {
loadData() loadData()
loading_demo.setOnClickListener {
loadData()
}
error_demo.setOnClickListener {
mPageLayout.showError()
}
empty_demo.setOnClickListener {
mPageLayout.showEmpty()
}
} }
private fun loadData(){ private fun loadData(){
@@ -51,4 +49,22 @@ class DemoActivity : AppCompatActivity() {
mPageLayout.hide() mPageLayout.hide()
},3000) },3000)
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menus, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_loading -> loadData()
R.id.menu_empty -> mPageLayout.showEmpty()
R.id.menu_error -> mPageLayout.showError()
R.id.menu_content -> mPageLayout.hide()
R.id.menu_customer -> mPageLayout.showCustom()
else -> {
}
}
return super.onOptionsItemSelected(item)
}
} }

View File

@@ -7,36 +7,6 @@
android:orientation="vertical" android:orientation="vertical"
tools:context=".DefaultActivity"> tools:context=".DefaultActivity">
<LinearLayout
android:gravity="center"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/loading"
android:text="加载"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/empty"
android:text="空布局"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/error"
android:text="错误布局"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/content"
android:text="内容布局"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_weight="1" android:layout_weight="1"
android:padding="20dp" android:padding="20dp"

View File

@@ -8,31 +8,6 @@
tools:context=".DemoActivity"> tools:context=".DemoActivity">
<LinearLayout
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/loading_demo"
android:text="自定义加载"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/empty_demo"
android:text="自定义空布局"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/error_demo"
android:text="自定义错误布局"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_weight="1" android:layout_weight="1"
android:padding="20dp" android:padding="20dp"

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:gravity="center"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:gravity="center"
android:layout_centerInParent="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_custom"
android:src="@mipmap/icon_smile"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginTop="10dp"
android:text="欢迎您"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_custom_content"
android:paddingBottom="3dp"
android:paddingTop="3dp"
android:text="This is PageLayout"
android:textColor="@color/colorPrimary"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>

View File

@@ -7,7 +7,6 @@
<TextView <TextView
android:text="自定义空布局" android:text="自定义空布局"
android:textSize="20sp"
android:id="@+id/tv_page_empty_demo" android:id="@+id/tv_page_empty_demo"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@@ -8,7 +8,6 @@
<TextView <TextView
android:gravity="center" android:gravity="center"
android:text="自定义错误布局" android:text="自定义错误布局"
android:textSize="20sp"
android:id="@+id/tv_page_error_demo" android:id="@+id/tv_page_error_demo"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@@ -13,10 +13,11 @@
android:layout_marginTop="10dp" /> android:layout_marginTop="10dp" />
<TextView <TextView
android:layout_marginTop="10dp"
android:id="@+id/tv_page_loading_demo" android:id="@+id/tv_page_loading_demo"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:text="正在加载中..." android:text="加载中..."
android:textSize="18sp" /> />
</LinearLayout> </LinearLayout>

27
app/src/main/res/menu/menus.xml Executable file
View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="me.bakumon.ugank.module.webview.WebViewActivity">
<item
android:id="@+id/menu_loading"
android:title="加载中"
app:showAsAction="never"/>
<item
android:id="@+id/menu_empty"
android:title="空数据"
app:showAsAction="never"/>
<item
android:id="@+id/menu_error"
android:title="出错"
app:showAsAction="never"/>
<item
android:id="@+id/menu_content"
android:title="内容布局"
app:showAsAction="never"/>
<item
android:id="@+id/menu_customer"
android:title="自定义布局"
app:showAsAction="never"/>
</menu>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="colorPrimary">#3F51B5</color> <color name="colorPrimary">#ff662c</color>
<color name="colorPrimaryDark">#303F9F</color> <color name="colorPrimaryDark">#ff662c</color>
<color name="colorAccent">#FF4081</color> <color name="colorAccent">#ff662c</color>
</resources> </resources>

View File

@@ -9,8 +9,8 @@ android {
defaultConfig { defaultConfig {
minSdkVersion 15 minSdkVersion 15
targetSdkVersion 27 targetSdkVersion 27
versionCode 1 versionCode 20180925
versionName "1.0" versionName "1.1"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

View File

@@ -9,7 +9,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
/** /**
@@ -21,12 +20,14 @@ class PageLayout : FrameLayout {
EMPTY_TYPE, EMPTY_TYPE,
LOADING_TYPE, LOADING_TYPE,
ERROR_TYPE, ERROR_TYPE,
CONTENT_TYPE CONTENT_TYPE,
CUSTOM_TYPE
} }
private var mLoading: View? = null private var mLoading: View? = null
private var mEmpty: View? = null private var mEmpty: View? = null
private var mError: View? = null private var mError: View? = null
private var mContent: View? = null private var mContent: View? = null
private var mCustom: View? = null
private var mContext: Context? = null private var mContext: Context? = null
private var mBlinkLayout: BlinkLayout? = null private var mBlinkLayout: BlinkLayout? = null
private var mCurrentState = State.CONTENT_TYPE private var mCurrentState = State.CONTENT_TYPE
@@ -52,6 +53,7 @@ class PageLayout : FrameLayout {
mContent?.visibility = if (type == State.CONTENT_TYPE) View.VISIBLE else View.GONE mContent?.visibility = if (type == State.CONTENT_TYPE) View.VISIBLE else View.GONE
mError?.visibility = if (type == State.ERROR_TYPE) View.VISIBLE else View.GONE mError?.visibility = if (type == State.ERROR_TYPE) View.VISIBLE else View.GONE
mEmpty?.visibility = if (type == State.EMPTY_TYPE) View.VISIBLE else View.GONE mEmpty?.visibility = if (type == State.EMPTY_TYPE) View.VISIBLE else View.GONE
mCustom?.visibility = if (type == State.CUSTOM_TYPE) View.VISIBLE else View.GONE
} }
@@ -79,6 +81,10 @@ class PageLayout : FrameLayout {
} }
} }
fun showCustom(){
showView(State.CUSTOM_TYPE)
}
class Builder { class Builder {
private var mPageLayout: PageLayout private var mPageLayout: PageLayout
@@ -86,6 +92,7 @@ class PageLayout : FrameLayout {
private var mContext: Context private var mContext: Context
private lateinit var mTvEmpty: TextView private lateinit var mTvEmpty: TextView
private lateinit var mTvError: TextView private lateinit var mTvError: TextView
private lateinit var mTvErrorRetry: TextView
private lateinit var mTvLoading: TextView private lateinit var mTvLoading: TextView
private lateinit var mTvLoadingBlink: TextView private lateinit var mTvLoadingBlink: TextView
private lateinit var mBlinkLayout: BlinkLayout private lateinit var mBlinkLayout: BlinkLayout
@@ -123,7 +130,8 @@ class PageLayout : FrameLayout {
mPageLayout.mError = mInflater.inflate(R.layout.layout_error, mPageLayout, false) mPageLayout.mError = mInflater.inflate(R.layout.layout_error, mPageLayout, false)
.apply { .apply {
mTvError = findViewById(R.id.tv_page_error) mTvError = findViewById(R.id.tv_page_error)
mTvError.setOnClickListener { mOnRetryClickListener?.onRetry() } mTvErrorRetry = findViewById(R.id.tv_page_error_retry)
mTvErrorRetry.setOnClickListener { mOnRetryClickListener?.onRetry() }
} }
mPageLayout.mError?.visibility = View.GONE mPageLayout.mError?.visibility = View.GONE
mPageLayout.addView(mPageLayout.mError) mPageLayout.addView(mPageLayout.mError)
@@ -171,8 +179,10 @@ class PageLayout : FrameLayout {
* 设置前需手动初始化好View中各个事件 * 设置前需手动初始化好View中各个事件
*/ */
fun setError(errorView: View): Builder { fun setError(errorView: View): Builder {
mPageLayout.mError = errorView mPageLayout.apply {
mPageLayout.addView(errorView) mError = errorView
addView(errorView)
}
return this return this
} }
@@ -189,6 +199,17 @@ class PageLayout : FrameLayout {
return this return this
} }
/**
* 自定义布局
*/
fun setCustomView(view: View): Builder{
mPageLayout.apply {
mCustom = view
addView(view)
}
return this
}
/** /**
* 设置加载文案 * 设置加载文案
*/ */
@@ -254,6 +275,22 @@ class PageLayout : FrameLayout {
return this return this
} }
/**
* 设置默认错误布局重试文案
*/
fun setDefaultErrorRetryText(text: String): Builder {
mTvErrorRetry.text = text
return this
}
/**
* 设置默认错误布局重试文案颜色
*/
fun setDefaultErrorRetryTextColor(color: Int): Builder {
mTvErrorRetry.setTextColor(mContext.resources.getColor(color))
return this
}
/** /**
* 设置空布局提醒图片 * 设置空布局提醒图片
*/ */
@@ -346,7 +383,4 @@ class PageLayout : FrameLayout {
fun onRetry() fun onRetry()
} }
abstract class CustomView{
abstract fun setView(pageLayout: PageLayout)
}
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -6,9 +6,8 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<TextView <TextView
android:textColor="@android:color/black" android:drawableTop="@drawable/pic_empty"
android:text="@string/page_empty" android:text="@string/page_empty"
android:textSize="20sp"
android:id="@+id/tv_page_empty" android:id="@+id/tv_page_empty"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@@ -1,17 +1,29 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<com.hankkin.pagelayout.BlinkLayout <com.hankkin.pagelayout.BlinkLayout
android:gravity="center" android:gravity="center"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<TextView <TextView
android:drawableTop="@drawable/pic_error"
android:gravity="center" android:gravity="center"
android:text="@string/page_error" android:text="@string/page_error"
android:textSize="20sp"
android:id="@+id/tv_page_error" android:id="@+id/tv_page_error"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<TextView
android:textColor="@color/colorPrimary"
android:layout_marginTop="10dp"
android:textSize="13sp"
android:gravity="center"
android:text="@string/page_error_retry"
android:id="@+id/tv_page_error_retry"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</com.hankkin.pagelayout.BlinkLayout> </com.hankkin.pagelayout.BlinkLayout>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="colorPrimary">#3F51B5</color> <color name="colorPrimary">#ff662c</color>
<color name="colorPrimaryDark">#303F9F</color> <color name="colorPrimaryDark">#ff662c</color>
<color name="colorAccent">#FF4081</color> <color name="colorAccent">#ff662c</color>
<color name="blink_color">#b1b1b1</color> <color name="blink_color">#b1b1b1</color>
<color name="shimmer_color">#a2878787</color> <color name="shimmer_color">#a2878787</color>

View File

@@ -1,5 +1,6 @@
<resources> <resources>
<string name="app_name">EmptyPage</string> <string name="app_name">EmptyPage</string>
<string name="page_error">网络开小差了\n点击重试</string> <string name="page_error">网络开小差了</string>
<string name="page_error_retry">点击重试</string>
<string name="page_empty">暂无新数据</string> <string name="page_empty">暂无新数据</string>
</resources> </resources>