一個DialogFragment
內部維護一個對話框,並要求根據其自己的生命週期顯示和隱藏它的方法。調用FragmentTransaction.hide()
只是試圖設置片段的視圖的知名度,深受Fragment.onCreateView()
返回的,要View.GONE。 DialogFragment的視圖恰好是用於其內部對話框的視圖,因此您正在做的是將內容隱藏在對話框中。不幸的是,隱藏視圖不會「關閉」對話框,因此屏幕仍然會變暗。
當您撥打DialogFragment.show(FragmentTransaction,String)
時,會創建一個FragmentTransaction
將其添加到FragmentManager
。通常,顯示對話框被認爲是「活動」交易,然後解散它只是彈出適當的次數。如果您之間沒有添加任何其他片段,則使用刪除操作創建新的FragmentTransaction。如果我們可以訪問這個,那麼我們可以添加一個backstack入口並使這個操作可逆。不幸的是,這是不可能的,所以我們能做的最好的就是讓我們自己的解僱方法(和希望的內部狀態不會太搞砸了):
public class UndoDialogFragmentActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// show a dialog fragment in the normal way
new MyDialogFragment().show(getSupportFragmentManager(), "dialog");
}
});
}
private static class MyDialogFragment extends DialogFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_TITLE, getTheme());
// do not allow back button to dismiss dialog; confusing behaviour otherwise!
setCancelable(false);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Button button = new Button(getActivity());
button.setText("Dismiss");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// pressing back after 'dismissing' the dialog will cause it to be added again
getFragmentManager().beginTransaction().remove(MyDialogFragment.this).addToBackStack(null).commit();
}
});
return button;
}
}
}
點擊片段中的按鈕會使用自己的解除按鈕打開DialogFragment。按下解除後,您可以通過按下後退鍵再次顯示對話框,撤消刪除操作。當您允許後退鍵顯示和隱藏對話框時,這會產生一些有問題的行爲,但細節可以由您根據您的應用程序決定。
我有這個奇妙的問題。(回 - >新片段),它是由註釋解決的BeginTransaction()在我的代碼刪除。不能underestand爲什麼回到'撤消'刪除操作。請解釋我! – 2013-07-05 10:12:51