在App開發的過程中爲了營造良好的用戶體驗,某個頁面在加載網絡數據失敗的時候一般的處理方式是出現某種狀態後顯示某個界面。例如沒有數據的時候
最簡單的解決方案就是:直接將這個界面的根佈局改成RelativeLayout。將異常狀態展示的界面設置到界面的最上層。默認該狀態不顯示VIew.GONE當數據爲空的狀態出現的時候再將該界面的顯示狀態修改成View.VISABLE。當然很多界面都會有這樣的需求。代碼冗餘不言而喻。
爲了解決這種問題下面提供三種解決方案:
方案一:使用標籤將提前編寫好的xml佈局文件引入。
此方案使用的地方以及特點,當在使用自定義組合控件的時候,使用該標籤可以方便快捷的引入xml佈局。
<include
layout="@layout/view_nondata"/>
此方案有個特點就是不能給include標籤給定id並通過id對該標籤下的佈局進行操作。最基本的顯示隱藏也無法做到。
方案二:使用標籤引入xml文件
<ViewStub
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/view_nondata"/>
View sonView = viewStub.inflate();
拿到的sonView就可以對xml文件中的控件進行操作,ViewStub有個特點就是,只能使用一次,你想第二次獲取它承載的子視圖是不可能的,因爲使用完畢他就會被移除。由於這個特性它通常也會被用作進行佈局優化的工具。
方案三:直接使用一個容器視圖佔好位置,在需要加載展示狀態的界面的時候使用addView()動態加載。
<LinearLayout
android:visibility="gone"
android:orientation="vertical"
android:id="@+id/parent_view"
android:layout_marginTop="48dp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
private LinearLayout parentView;
parentView = (LinearLayout) findViewById(R.id.parent_view);
parentView.setVisibility(View.VISIBLE);
parentView.removeAllViews();
View sonView = LayoutInflater.from(recordList.this).inflate(R.layout.view_servererror,parentView,false);
sonView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getAllRecordList(page , port);
parentView.setVisibility(View.GONE);
}
});
parentView.addView(sonView);
三種方案各有千秋。