Android手写状态切换布局

简介: 实现状态切换布局image效果图image原理继承RelativeLayout,然后向其中添加各种状态的View,通过对各种View的显示隐藏的切换来实现各种状态的切换。

实现状态切换布局

img_2c0a8d63364bb2a3beb1082c64f97772.png
image

效果图

img_6b23090d49db14f866045ce2c3574632.gif
image

原理

继承RelativeLayout,然后向其中添加各种状态的View,通过对各种View的显示隐藏的切换来实现各种状态的切换。

实现过程

1.继承RelativeLayout,这里通过构造方法之间的调用来简化实例化需要写的代码

public class LoadingLayout extends RelativeLayout {
public LoadingLayout(Context context) {
    this(context,null);
}

public LoadingLayout(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs,0);
}

public LoadingLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

}

2.添加设置状态View的方法,以及盛放状态View的集合

private View LoadingView,SuccessView,FaildView;
private ArrayList<View> views;
public void setStatusView(View loadingView, View successView, View faildView){
    if(views==null){
        views=new ArrayList<>();
    }else if(views.size()>0){
        views.clear();
    }
    if(getChildCount()>0){
        removeAllViews();
    }
    LoadingView=loadingView;
    SuccessView=successView;
    FaildView=faildView;
    LoadingView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    SuccessView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    FaildView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    addView(LoadingView);
    addView(SuccessView);
    addView(FaildView);
    views.add(LoadingView);
    views.add(SuccessView);
    views.add(FaildView);
}

3.添加隐藏状态View的方法

private void HideViews(){
    if(views!=null&&views.size()>0){
        for(View v:views){
            v.setVisibility(GONE);
        }
    }
}

4.添加设置状态的方法,这里使用enum来对状态进行判断

public void setStatus(LoadingType loadingType){
    //在设置之前先将所有View隐藏
    HideViews();
    switch (loadingType){
        case LOADING:
            if(LoadingView!=null){
                LoadingView.setVisibility(VISIBLE);
            }
            break;
        case SUCCESS:
            if(SuccessView!=null){
                SuccessView.setVisibility(VISIBLE);
            }
            break;
        case FAILD:
            if(FaildView!=null){
                FaildView.setVisibility(VISIBLE);
            }
            break;
    }
}
public enum LoadingType{
    LOADING,SUCCESS,FAILD
}

5.在布局文件中使用LoadingLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.jianshupro.MainActivity">
<LinearLayout
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="wrap_content">
    <Button
        android:layout_width="wrap_content"
        android:text="加载"
        android:id="@+id/bt_loading"
        android:onClick="onClick"
        android:layout_height="wrap_content" />
    <Button
        android:layout_width="wrap_content"
        android:text="成功"
        android:onClick="onClick"
        android:id="@+id/bt_success"
        android:layout_height="wrap_content" />
    <Button
        android:layout_width="wrap_content"
        android:text="失败"
        android:onClick="onClick"
        android:id="@+id/bt_faild"
        android:layout_height="wrap_content" />
</LinearLayout>
<com.example.administrator.jianshupro.view.LoadingLayout
    android:id="@+id/myloadlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</com.example.administrator.jianshupro.view.LoadingLayout>

</LinearLayout>

6.在Activity中实现逻辑

public class MainActivity extends AppCompatActivity {
private LoadingLayout mLoadingLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mLoadingLayout=findViewById(R.id.myloadlayout);
    //添加状态View
    mLoadingLayout.setStatusView(View.inflate(this,R.layout.view_loading,null),View.inflate(this,R.layout.view_success,null),View.inflate(this,R.layout.view_faild,null));

}
public void onClick(View view){
    switch (view.getId()){
        case R.id.bt_loading:
            mLoadingLayout.setStatus(LoadingLayout.LoadingType.LOADING);
            break;
        case R.id.bt_success:
            mLoadingLayout.setStatus(LoadingLayout.LoadingType.SUCCESS);
            break;
        case R.id.bt_faild:
            mLoadingLayout.setStatus(LoadingLayout.LoadingType.FAILD);
            break;
    }
}
}
目录
相关文章
|
7月前
|
XML Android开发 数据安全/隐私保护
10. 【Android教程】网格布局 GridLayout
10. 【Android教程】网格布局 GridLayout
336 1
|
3月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
5月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
77 10
|
7月前
|
Android开发
08. 【Android教程】相对布局 RelativeLayout
08. 【Android教程】相对布局 RelativeLayout
95 0
|
3月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
186 0
|
5月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
75 1
|
6月前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
143 15
|
5月前
|
XML 数据可视化 API
Android经典实战之约束布局ConstraintLayout的实用技巧和经验
ConstraintLayout是Android中一款强大的布局管理器,它通过视图间的约束轻松创建复杂灵活的界面。相较于传统布局,它提供更高灵活性与性能。基本用法涉及XML定义约束,如视图与父布局对齐。此外,它支持百分比尺寸、偏移量控制等高级功能,并配有ConstraintSet和编辑器辅助设计。合理运用可显著提高布局效率及性能。
281 0
|
5月前
|
Android开发
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
73 0
|
6月前
|
XML Android开发 数据安全/隐私保护
使用RelativeLayout布局Android界面
使用RelativeLayout布局Android界面