在Android开发的过程中,错误页面,空白页面,网络加载页面,甚至各种各样的状态的页面是少不了的,比如说,当我们在加载一处网络数据时,网络请求的过程中我们要显示加载中的页面,如果请求下来的数据为空,我们要提示给用户当前数据为空的界面,如果要是加载失败,还要再展示加载失败页面,总之就是根据不同的情况,然后对应不同的页面。
一般遇到这种情况的时候,大体上的思路就是每个页面都分别include各个这样的异常页面,然后根据出现的异常情况来动态 设置visible/gone,这样虽然说是效果是那个效果,但是这样在xml也要处理,java文件也要处理,想想感觉就很麻烦,而且感觉代码也不是很优雅,那么有木有个简单一点的处理办法呢?
其实我们可以尝试着一个新的思路,就是不管什么错误页面,空白页面呀什么的对应本该显示内容页面,不再是可见与不可以的关系,而是哪个页面添加到其父容器的关系,添加进去了的就显示,没有添加的可能就显示不出来,并且保证他们在父容器里面的layoutParams是一样的就行咯,而且完全不需要修改以前的layout文件。
首先,在找到想要替换的View/ViewGroup:
View targetView = findVIewById(R.id.target_view);
然后,找到其在父容器中的位置与layoutParams:
ViewParent viewParent = targetView .getParent();
int index = viewParent .indexOfChild(targetView);
ViewGroup.LayoutParams layoutParams = targetView.getLayoutParams()
最后,就是将想要展示出来的Layout(比如说加载页面,错误页面,以下就以R,layout.loading为例)替换掉之前的targetView在其父容器中的位置就行了:
LayoutInflater factory = LayoutInflater.from(targetView .getContext());
View view = factory.inflate(layoutResId, viewParent , false);
//view 替换掉targetView
viewParent .removeViewInLayout(targetView );
viewParent .addView(view, index, layoutParams);
但是,总是直接这样使用感觉还是不太好,于是我根据上面的思路,进行了下简单的封装。源码以及使用方法都放在github上了。
github地址:https://github.com/Lymeki/StubSwitcher
上个效果图:
欢迎讨论;