Android为全局添加View

需求

给所有涉及网络请求Activity和Fragment添加一个断网的页面(以下简称emptyView),并且带有点击刷新功能,界面如图


方法

1. 在需要显示emptyView的Activity和Fragment的layout中使用FrameLayout布局包括需要隐藏的内容和emptyView,并且EmptyView要在下方,Visiable设置GONE

缺点:方法简单,没有难度,除了麻烦就是麻烦,写着麻烦,看着也麻烦

2. 封装一个基本EmptyActivity,重写setContentView()方法,new一个FrameLayout container,add emptyView和通过LayoutInflater得到的View,实例化emptyView中的按钮和点击事件,添加显示的方法。

示例代码

public class EmptyActivity extends AppCompatActivity {    protected Context context;    private View view404, view;    private FrameLayout container;    private Button btnRefresh;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        context = this;    }    @Override    public void setContentView(int layoutResID) {        super.setContentView(getContainer());        view = LayoutInflater.from(this).inflate(layoutResID, null);        container.addView(view, 0);    }    private View getContainer() {        container = new FrameLayout(this);        view404 = LayoutInflater.from(this).inflate(R.layout.view_404, null, false);        btnRefresh = view404.findViewById(R.id.btn_404_refresh);        container.addView(view404);        return container;    }    /**     * 设置404显示状态     *     * @param visiable     */    protected void set404Visiable(boolean visiable) {        if (visiable) {            view404.setVisibility(View.VISIBLE);        } else {            view404.setVisibility(View.GONE);        }    }    /**     * 404刷新数据回调     *     * @param listener     */    protected void setRefreshListener(View.OnClickListener listener) {        btnRefresh.setOnClickListener(listener);    }}

缺点:新添加的emptyView是全屏效果的,会遮盖导航栏,UI肯定不会同意的

3. EmptyFragment与EmptyActivity类似,不过需要重写onCreateView方法,需要注意Fragment的容器是Activcity,不需要每次创建一个新的Fragment都添加emptyView

如果在fragment中获取父容器,我还没有一个好的办法,目前能想到的就是通过getActivity().findViewById(R.id.container);这么做就需要固定父容器的id为container,本人不喜欢

通过方法2和3的方法可以打开思路,比如添加一个toolbar,还有我采用的方法4。

4. 我所用的方法:方法2和3思路就是得到一个父容器然后再添加需要展示的view和emptyView,那我就自定义一个父容器,本身包括emptyView并暴露方法,在需要展示emptyView的layout中使用自定的的父容器。代码如下
public class NoNetFrameLayout extends FrameLayout {    private Context context;    private View view404;    private Button btnRefresh;    public NoNetFrameLayout(@NonNull Context context) {        this(context, null);    }    public NoNetFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {        super(context, attrs);        this.context = context;        init();    }    private void init() {        view404 = LayoutInflater.from(context).inflate(R.layout.view_404, null, false);        btnRefresh = view404.findViewById(R.id.btn_404_refresh);        addView(view404);    }    /**     * 设置404显示状态     *     * @param visiable     */    public void set404Visiable(boolean visiable) {        if (visiable) {            view404.setVisibility(View.VISIBLE);            bringChildToFront(view404);        } else {            view404.setVisibility(View.GONE);        }    }    /**     * 404刷新数据回调     *     * @param listener     */    public void setRefreshListener(View.OnClickListener listener) {        btnRefresh.setOnClickListener(listener);    }}

注意:


  1. emptyView的layout必须要设置一个背景颜色,否则就会显示下面的View
  2. 需要显示的view,必须用一个布局包起来,否则就会显示下面的View

用法很简单就不多介绍了,只要注意以上两点就行,看不懂的可以去看例子中的注释

5. 别人提供的方法:Activity layout中添加emptyView,如果Fragment需要显示emptyView,向Activity发送消息,hide fragment,show emptyView,点击事件通过接口回调

个人觉得麻烦,需要fragment和activity来回调用方法,不喜欢

方法4效果预览

总结

  • 方法1太麻烦,不推荐
  • 方法2和3适合已经完成的项目,改动较少
  • 方法4个人觉得适合刚开始的项目,即使已经完成改动也相对简单
  • 看个人爱好吧,喜欢什么就用什么,如果有更好办法的小伙伴,欢迎提出啊!

GitHub

GitHub

更多相关文章

  1. Android应用程序的默认最大内存值以及修改
  2. MTK Android(安卓)紧急号码修改
  3. activity和service之间的相互通信方法
  4. Android(安卓)Handler,Looper,MessageQueue关系(讲解比较透彻的)
  5. Android(安卓)setTag方法的key问题
  6. android Bitmap如何保存成为一个bmp文件
  7. Android(安卓)通知栏Notification的整合 全面学习 (一个DEMO让你
  8. Android中屏蔽 电源键长按、Home键、Home长按
  9. Android高频面试专题 - 基础篇(一)Activity

随机推荐

  1. android个人视频学习笔记(二)
  2. Android(安卓)Lib层打印log之------bioni
  3. 移动应用开发辅助服务推荐
  4. 在代码中实现按下Home键的效果
  5. android coredump 调试
  6. Android小技巧总结1
  7. Android(安卓)studio 获取手机联系人和号
  8. Android(安卓)谷歌gcm推送所需要的端口
  9. Android学习笔记(三):Andriod程序框架
  10. Android四大组件之Activity(一)