2014-05-15 23 views
2

我有一個FrameLayout活動,需要根據用戶輸入顯示不同的片段。片段切換視圖被重用?

我使用呈現出碎片的代碼是這樣的:

private void showFragment(Fragment fragment, Bundle args, boolean addToBackStack) { 

    if (args != null) { 
     fragment.setArguments(args); 
    } 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

    fragmentTransaction.setCustomAnimations(R.anim.activity_open_translate, R.anim.activity_close_scale); 

    fragmentTransaction.replace(R.id.main_frame, fragment); 

    if (addToBackStack) { 
     fragmentTransaction.addToBackStack(fragment.getClass().getName()); 
    } 
    fragmentTransaction.commit(); 
} 

。這被稱作:

if (contactPickFragment == null) { 
    contactPickFragment = new ContactPickFragment(); 
} 
showFragment(contactPickFragment, args, true); 

這一切工作正常。現在,如果用戶進入一個片段後按下並返回到同一片段,則我所有的視圖都保持不變。例如,我在片段內部有一個EditText,用戶在裏面編輯內容。如果用戶回到片段,相同的文本仍然存在。我不希望發生這種情況。如何重置視圖中的所有內容?

我已經在Fragment的onCreateView()中添加了代碼來清除文本,並且從調試中我看到這是被調用的,但文本永遠不會被清除。我在這裏做錯了什麼?

回答

1

如果您不希望顯示前一個實例的數據,只需在每次顯示時創建一個新的ContactPickFragment實例即可。

清除onCreateView()中的數據不起作用,因爲視圖狀態在onCreateView()之後被恢復。您的片段在onCreateView()之前沒有任何觀點,所以Android不可能早些時候應用之前的狀態。 onCreateView()期間在視圖上設置的值將被先前的值覆蓋。

+0

好的,這是一個很好的解釋。但是我擔心,如果我使用新的實例,舊的實例是否仍然會附加到該活動?如果來回太多,這不是一個記憶問題嗎?或者你建議我手動刪除片段而不是替換? – Anoop

+0

@Anoop如果用戶按下'後退',Android將撤消你的Fragment事務 - 它將刪除在該事務中添加的任何Fragment,並將添加在該事務中刪除的任何Fragment。按下後,舊實例不應附加到活動。 – antonyt

0

作爲一般答案,除了用自己的另一個實例替換片段(可能使用要刷新/更新的參數初始化)之外,沒有辦法「刷新」片段的視圖。

0

可以重用您的片段並刷新您的視圖狀態。 @antonyt正確地指出,你無法從onCreateView執行此操作。

相反,重寫onViewStateRestored並按照您希望的方式設置視圖的狀態。

喜歡的東西:

@Override 
public void onViewStateRestored(Bundle savedInstanceState) { 
    super.onViewStateRestored(savedInstanceState); 
    View view = getView(); 

    // Code to call view.findViewById to grab the views you want 
    // and set them to a specific state goes here 
} 

有再使用碎片優勢。其中最不重要的是,如果你的片段有內存泄漏(比你想象的要容易完成),你會通過創建無數的片段來加劇問題。