2012-02-08 35 views
4

我想一個安卓:FragmentTransaction隱藏不爲DialogFragment

fragmentTransaction.hide(myDialogFragment); 
fragmentTransaction.addToBackStack(null); 

添加到FragmentTransaction,這樣當用戶點擊後退按鈕,對話框將重新出現的工作,但它不工作。我本來推翻onCreateDialog在我DialogFragment,但我注意到,對於hide呼叫FragmentTransaction文檔指出:

這僅僅是片段,其觀點已被添加到一個容器 相關。

因此,現在我重寫onCreateView。現在它有點隱藏,但不是真的。對話只是枯萎,但窗戶仍然黑暗。我必須打開後退按鈕才能擺脫它,顯然這不是我想要的行爲。我在這裏錯過了什麼?

回答

8

一個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。按下解除後,您可以通過按下後退鍵再次顯示對話框,撤消刪除操作。當您允許後退鍵顯示和隱藏對話框時,這會產生一些有問題的行爲,但細節可以由您根據您的應用程序決定。

+1

我有這個奇妙的問題。(回 - >新片段),它是由註釋解決的BeginTransaction()在我的代碼刪除。不能underestand爲什麼回到'撤消'刪除操作。請解釋我! – 2013-07-05 10:12:51

4

我可以通過我的DialogFragment內調用從getDialog().hide()躲DialogFragment的對話框。

1

如果您使用API Level 11或更高版本,你可以簡單地調用dismiss()DialogFragment,無論是從FragmentActivityDialogFragment本身。