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;
    }
}
}
目录
相关文章
|
8月前
|
XML 前端开发 Android开发
Android XML 布局基础(四)内外边距(margin、padding)
Android XML 布局基础(四)内外边距(margin、padding)
169 0
|
8月前
|
编解码 Android开发
Android 常用布局单位区别(dp、sp、px、pt、in、mm)
Android 常用布局单位区别(dp、sp、px、pt、in、mm)
306 0
|
4月前
|
Android开发
Android Studio入门之常用布局的讲解以及实战(附源码 超详细必看)(包括线性布局、权重布局、相对布局、网格布局、滚动视图 )
Android Studio入门之常用布局的讲解以及实战(附源码 超详细必看)(包括线性布局、权重布局、相对布局、网格布局、滚动视图 )
133 0
|
4月前
|
Android开发 容器
Android开发,学习LinearLayout布局
Android开发,学习LinearLayout布局
39 0
|
4月前
|
XML Java Android开发
Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
44 0
|
4月前
|
XML Java Android开发
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
Android Studio App开发中工具栏Toolbar、溢出菜单OverflowMenu、标签布局TabLayout的讲解及实战(实现京东App的标签导航栏,附源码)
59 0
|
4月前
|
Android开发 容器
Android开发第二次课 布局方式
Android开发第二次课 布局方式
23 0
|
6月前
|
XML 前端开发 Android开发
android 前端常用布局文件升级总结(一)
android 前端常用布局文件升级总结(一)
|
8月前
|
Android开发
Android 使用DataBinding时 将布局页面转换为数据绑定布局(Convert to data binding layout) 不出现提示解决办法
Android 使用DataBinding时 将布局页面转换为数据绑定布局(Convert to data binding layout) 不出现提示解决办法
94 0
|
8月前
|
Android开发
Android 实现布局的缩小和再放大动画(使用scale动画效果进行实现)
Android 实现布局的缩小和再放大动画(使用scale动画效果进行实现)
587 0