当前位置: 首页 > news >正文

建网站和开发app哪个难wordpress 经典推荐

建网站和开发app哪个难,wordpress 经典推荐,景区微网站建设费用,wordpress做付费下载站文章目录 Android StateLayout状态页概述源码使用源码下载 Android StateLayout状态页 概述 StateLayout(状态页)包含:加载中页面,错误页面,空页面,内含状态默认页面,支持自定义页面。 源码 …

文章目录

  • Android StateLayout状态页
    • 概述
    • 源码
    • 使用
    • 源码下载

Android StateLayout状态页

概述

StateLayout(状态页)包含:加载中页面,错误页面,空页面,内含状态默认页面,支持自定义页面。

在这里插入图片描述

源码

全局配置:

package com.example.tools.state_layout.widgetsimport android.view.View
import androidx.annotation.LayoutRes/*** StateLayout全局配置*/
object StateConfig {@LayoutRes@JvmStaticvar emptyLayoutRes = View.NO_ID@LayoutRes@JvmStaticvar errorLayoutRes = View.NO_ID@LayoutRes@JvmStaticvar loadingLayoutRes = View.NO_ID@LayoutRes@JvmStaticvar retryIds: IntArray? = nullprivate var mOnStateChangeListener: OnStateChangeListener? = nullfun setOnStateChangeListener(listener: OnStateChangeListener) {mOnStateChangeListener = listener}fun getOnStateChangeListener(): OnStateChangeListener? {return mOnStateChangeListener}
}

状态监听:

interface OnStateChangeListener {fun showState(status: Int)
}

属性:

<declare-styleable name="StateLayout"><attr name="empty_layout" format="reference" /><attr name="loading_layout" format="reference" /><attr name="error_layout" format="reference" />
</declare-styleable>

代码:

class StateLayout @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {companion object {const val STATE_LOADING = 0xA001const val STATE_EMPTY = 0xA002const val STATE_ERROR = 0xA003const val STATE_CONTENT = 0xA004}// empty布局资源@LayoutResprivate var emptyLayoutRes = View.NO_IDget() = if (field == View.NO_ID) StateConfig.emptyLayoutRes else field// loading布局资源@LayoutResprivate var loadingLayoutRes = View.NO_IDget() = if (field == View.NO_ID) StateConfig.loadingLayoutRes else field// error布局资源@LayoutResprivate var errorLayoutRes = View.NO_IDget() = if (field == View.NO_ID) StateConfig.errorLayoutRes else field// 保存状态private val stateInfoMap = ArrayMap<Int, View>()// 当前状态private var currentState = STATE_CONTENT// 需要设置点击事件的idprivate var retryIds: IntArray? = nullget() = field ?: StateConfig.retryIdsprivate var mOnStateChangeListener: OnStateChangeListener? = nullget() = field ?: StateConfig.getOnStateChangeListener()init {val a: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.StateLayout)emptyLayoutRes = a.getResourceId(R.styleable.StateLayout_empty_layout, View.NO_ID)loadingLayoutRes = a.getResourceId(R.styleable.StateLayout_loading_layout, View.NO_ID)errorLayoutRes = a.getResourceId(R.styleable.StateLayout_error_layout, View.NO_ID)a.recycle()}override fun onFinishInflate() {super.onFinishInflate()if (childCount != 1) {throw IllegalStateException("StateLayout必须只能有一个子View")}if (stateInfoMap.size == 0) {val view = getChildAt(0)setContentView(view)}}/*** 设置内容布局*/private fun setContentView(contentView: View) {stateInfoMap[STATE_CONTENT] = contentView}/*** 设置点击事件*/fun setRetryIds(@IdRes vararg ids: Int) {retryIds = ids}/*** 设置状态变化监听*/fun setOnStateChangeListener(listener: OnStateChangeListener) {mOnStateChangeListener = listener}/*** 显示内容布局*/fun showContent() {showState(STATE_CONTENT)}/*** 显示加载布局*/fun showLoading() {showState(STATE_LOADING)}/*** 显示失败布局*/fun showError() {showState(STATE_ERROR)}/*** 显示空布局*/fun showEmpty() {showState(STATE_EMPTY)}/*** 显示视图*/private fun showState(status: Int) {if (currentState == status) {return}val stateView = getStateView(status)for (i in stateInfoMap) {if (i.key != status) {val view = i.valuehideStateView(view)}}showStateView(this, stateView, status)mOnStateChangeListener?.showState(status)currentState = status}/*** 获取状态视图*/private fun getStateView(status: Int): View {val view = stateInfoMap[status]if (view != null) {return view} else {val layoutRes = when (status) {STATE_EMPTY -> emptyLayoutResSTATE_ERROR -> errorLayoutResSTATE_LOADING -> loadingLayoutResSTATE_CONTENT -> View.NO_IDelse -> View.NO_ID}if (layoutRes == View.NO_ID) {when (status) {STATE_ERROR -> throw Resources.NotFoundException("请设置errorLayout")STATE_EMPTY -> throw Resources.NotFoundException("请设置emptyLayout")STATE_LOADING -> throw Resources.NotFoundException("请设置loadingLayout")STATE_CONTENT -> throw Resources.NotFoundException("请设置contentView")}}val view = LayoutInflater.from(context).inflate(layoutRes, this, false)stateInfoMap[status] = viewreturn view}}/*** 隐藏视图*/private fun hideStateView(view: View) {view.visibility = View.GONE}/*** 显示视图*/private fun showStateView(container: StateLayout, view: View, status: Int) {if (container.indexOfChild(view) != -1) {view.visibility = View.VISIBLE} else {if (status == STATE_EMPTY || status == STATE_ERROR) {if (retryIds != null) {for (id in retryIds!!) {view.findViewById<View>(id).setOnClickListener {showLoading()}}}}container.addView(view)}}
}

使用

使用全局配置:

<com.example.tools.state_layout.widgets.StateLayoutandroid:id="@+id/state_layout"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="加载成功" />
</com.example.tools.state_layout.widgets.StateLayout>
StateConfig.emptyLayoutRes = R.layout.state_empty
StateConfig.errorLayoutRes = R.layout.state_error
StateConfig.loadingLayoutRes = R.layout.state_loading
StateConfig.retryIds = intArrayOf(R.id.state_msg, R.id.state_iv)StateConfig.setOnStateChangeListener(object : OnStateChangeListener {override fun showState(status: Int) {when (status) {StateLayout.STATE_LOADING -> {LogUtils.e("StateLayout", "显示加载页")postDelayed({stateLayout.showContent()}, 2000L)}StateLayout.STATE_CONTENT -> {LogUtils.e("StateLayout", "显示内容页")}StateLayout.STATE_ERROR -> {LogUtils.e("StateLayout", "显示失败页")}StateLayout.STATE_EMPTY -> {LogUtils.e("StateLayout", "显示空页")}}}
})

使用局部配置:

<com.example.tools.state_layout.widgets.StateLayoutandroid:id="@+id/state_layout"android:layout_width="match_parent"android:layout_height="match_parent"app:empty_layout="@layout/state_empty"app:error_layout="@layout/state_error"app:loading_layout="@layout/state_loading"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="加载成功" />
</com.example.tools.state_layout.widgets.StateLayout>
stateLayout.setRetryIds(R.id.state_msg, R.id.state_iv)
stateLayout.setOnStateChangeListener(object : OnStateChangeListener {override fun showState(status: Int) {when (status) {StateLayout.STATE_LOADING -> {LogUtils.e("StateLayout", "显示加载页")postDelayed({stateLayout.showContent()}, 2000L)}StateLayout.STATE_CONTENT -> {LogUtils.e("StateLayout", "显示内容页")}StateLayout.STATE_ERROR -> {LogUtils.e("StateLayout", "显示失败页")}StateLayout.STATE_EMPTY -> {LogUtils.e("StateLayout", "显示空页")}}}
})

源码下载

http://www.yayakq.cn/news/922866/

相关文章:

  • 做体育设施工程公司的网站wordpress 静态链接
  • 住宅房做旅店是什么网站wordpress android下载
  • 南阳企业网站品牌网站建设方案
  • 牡丹江市西安区建设局网站泰安市星际网络科技有限公司
  • 河南省交通基本建设质量检测监督站网站青羊区企业网站建设策划
  • 怎么能查到网站是哪家公司做的什么网上平台可以找客源
  • 捡个校花做老婆是哪个网站的免费商城系统哪个好
  • 国外ps设计图网站做教育app的网站有哪些内容
  • 海淘网站建设的目的网络营销的解释
  • 网站备案的影响试析媒体网站品牌建设
  • 怎么做自己的淘宝网站wordpress无法连接数据库
  • 新余建设银行招聘网站自己做卖东西网站
  • 做网站如何把栏目放到首页福州制作网站设计哪里比较好
  • 网站维护外包合同客户管理软件单机版
  • 南昌优秀网站建设网站栏目结构图
  • 国外做美食视频网站电子商务网站建设收益
  • 萤石云网站开发大型网站架设需要考虑哪些问题
  • 网站的开发语言网络架构是什么
  • icp许可证个人网站个人网页在线制作
  • 如何做网站插件管理平台登录
  • 网站搭建怎么弄的微信公众号外链接网站开发
  • 南宁网站开发价格wordpress支持大数据处理
  • php做网站用什么开发工具建设网站八大员成绩查询
  • 网站做零售公司网站建设费用计入什么科目
  • 网站建设流程步骤为需求分析企业的网站设计能否以为导向
  • asp 通过ftp 网站搬家网站建设总计
  • 广州市开发区建设局官方网站网站搭建平台demo免费
  • 门户网站建设情况汇报优秀网页设计作品分析ppt
  • 济宁祥云网站建设软件开发项目内容
  • 泉州企业建站模板合肥app建设公司