2

我正在構建的應用程序有一個用例,其中基於某些數據,我在Fragment中創建了部分。爲了可視化,給定片段A具有主容器元素爲ScrollView的佈局。在那裏,滾動視圖有一個工具欄(與這個問題無關),然後ConstraintLayout(顯示所有片段的內容,我們稱之爲masterLayout)。我需要做的是根據boolean(我們稱之爲hasSection)從masterLayout中刪除視圖組件。因此,有時片段A將顯示masterLayout(它不在容器中的位置0處 - 它是視圖樹中的第5個組件),有時它不會。現在,我試圖簡單地撥打電話:在將可見性設置爲View後,在ConstraintLayout中恢復視圖.GONE

((ViewGroup)masterLayout.getParent()).removeView(masterLayout); 

它部分工作。這裏的問題是,視圖被刪除,但它佔用的空間不是。因此,在視圖樹中出現在該視圖之後的任何其他孩子將不會「向上移動」。我不能這樣說,因爲masterLayout的高度= 200dp。正如你所看到的,它將佔據屏幕的很大一部分。因此,在研究網絡之後,我發現瞭解決方案來設置其可見性:

masterLayout.setVisibility(View.GONE); 

它按預期工作。該視圖被刪除,所有進一步的子視圖相應地向上移動,因此沒有空的和不需要的空間。問題是,當我從這個片段轉移(讓我們說有一個可點擊的視圖,將用戶帶到不同的片段)並再次回到它(例如使用後退按鈕onBackPressed()),masterLayout被設置爲可見性= View.GONE不會再出現。

我怎樣才能達到去除/從佈局隱藏的特定視圖,與具有下一個視圖的功能它下面向上移動以覆蓋空的空間而導航回到描述片段時恢復原始佈局(如View.GONE一樣) ?邏輯

全碼:

if(isTypeA){ 
     new FetchUser(USERID){ 
      @Override 
      protected void onPostExecute(User user){ 
       mUser = user; 
      } 
     }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

     new FetchImages(mUser.getType()){ 
      @Override 
      protected void onPostExecute(List<Image> result){ 
       if(mImageList.isEmpty() && !result.isEmpty()){ 
        mImageList.addAll(result); 
        mAdapter = new ItemAdapter(getChildFragmentManager(), mImageList.size(), mImageList); 
        mItemCardPager.setAdapter(mAdapter); 
       }else{ 
        if(mMasterLayout != null){ 
         mMasterLayout.setVisibility(View.GONE); 
        } 
       } 
      } 
     }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    } 

回答

1

Fragment lifecycle可以幫助在這裏。

一種方法是始終將該masterLayout恢復到片段的onResume方法中的可見性View.VISIBLE。

@Override 
public void onResume() { 
    super.onResume(); 
    masterLayout.setVisibility(View.VISIBLE); 
} 
+0

不幸的是,以前設置其對View.GONE的可見性時不起作用。我曾經嘗試過你的方法。 – Austie

+0

有趣。好。我想這會有助於查看您的應用正在使用的代碼,特別是該代碼片段的代碼以及在應用顯示下一個片段時添加或替換該代碼片段的代碼。 –

+0

我正在談論的片段A服務於用戶配置文件視圖的目的。因此,有一個標題部分與圖像+其他信息,下面有一個viewpager部分保存圖像顯示爲卡片視圖。在該部分下面還有其他類型的內容,但是以類似的方式。事情是,用戶可以有兩種類型,讓我們說typeA和typeB。如果用戶是A類型,那麼當顯示配置文件時,應該顯示第二部分(帶有viewpager)。如果他是typeB,那麼viewpager部分不應該在那裏,下面的內容應該顯示在標題的下方 – Austie

相關問題