9

我正在製作一個蜂窩項目/叉向後兼容1.6+的過程。設備API級別的對話框片段<11

根據谷歌/安卓系統提供的文檔,我決定將所有關於DialogFragment的片段都製作成非常適合蜂窩的格式......它使我能夠靈活地將任何東西當作對話框或「全屏」元素。

我現在已經包含了兼容性工具包,並將我的導入和方法調用移到了該位置。現在,我在2.3我試圖推出一個相同的意圖,但我得到這個問題:

java.lang.IllegalStateException: DialogFragment can not be attached to a container view 

DialogFragment的文件表明,它可以作爲Fragment執行,當你不想要的對話框/彈出功能。

回答

9

我設法在兼容包的DialogFragment.java妥善解決這個問題:

更改行74: boolean mShowsDialog = false;

註釋掉行232://mShowsDialog = mContainerId == 0;

然後改變兩個表演方法對此:

public void show(FragmentManager manager, String tag) { 
    this.setShowsDialog(true); 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.add(this, tag); 
    ft.commit(); 
} 

// JavaDoc removed 
public int show(FragmentTransaction transaction, String tag) { 
    this.setShowsDialog(true); 
    transaction.add(this, tag); 
    mRemoved = false; 
    mBackStackId = transaction.commit(); 
    return mBackStackId; 
} 

基本上,他們確實支持寫入,但切換對話框/嵌入式的切換不起作用。

所以這裏我們默認爲嵌入,然後設置爲在我們展示它之前顯示爲對話框。

+0

還:'onSaveInstanceState'只能保存'mShowsDialog',如果它是'true'。你只需要從'if'中刪除'!'。 – 2011-10-21 01:24:56

+0

在哪個版本(https://android.googlesource.com/platform/frameworks/support中的SHA1提交ID)基於?我試圖用當前版本的支持庫重現您的修補程序,但是無法正確執行此操作,因爲Google顯然沒有使用它們用於發行版的r 修訂版代碼進行標記。我已經嘗試提交863d7b4。 – 2012-12-19 10:17:43

+0

我的意思是:我將你的變更集與提交863d7b4進行了比較。 – 2012-12-19 10:30:58

2

我遇到了同樣的問題。我從來沒有找到一個「正確的」解決方案,但是您可以通過在OnCreateDialog()中設置對話框的主題來做同樣的事情。通過將主題設置爲android.R.style.Theme_Holo_DialogWhenLarge,該對話框將在大屏幕和大屏幕上顯示爲對話框,而在小屏幕和普通屏幕上將顯示爲全屏窗口。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_DialogWhenLarge); 
} 
0

您是否檢查了應用筆記?它顯示了一個嵌入對話框的推薦方法,我已經驗證了這個在2.2.1上的作用。

http://developer.android.com/reference/android/app/DialogFragment.html#DialogOrEmbed

我的片段佈局必須改變,以符合,但它是快速和容易。能夠用XML定義對話框片段並且期望在沒有任何額外工作的情況下嵌入對話框片段是更自然的(如上面對Compat API的支持所支持的那樣);並且只在通過show()調用時纔會期望模態行爲。我想這不是目前的行爲。

2

我正在使用DialogFragment子類,並在onCreate()作品中執行此技巧。我打電話的onCreate前setShowsDialog()()被調用(在onAttachFragment()我的活動)

public class DialogFragmentHosted extends DialogFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     boolean forceShowDialog = savedInstanceState==null; 
     boolean showsDialog = getShowsDialog(); 
     super.onCreate(savedInstanceState); 
     if (forceShowDialog) 
      setShowsDialog(showsDialog); 
    } 
} 
3

可以使用android.support.v4.app.DialogFragment版本,請檢查here

相關問題