【问题标题】:DialogFragments with devices api level < 11设备 api 级别 < 11 的 DialogFragments
【发布时间】:2011-04-12 15:39:26
【问题描述】:

我正在使蜂窝项目/fork 向后兼容 1.6+。

根据 Google/Android 提供的文档,我决定从 DialogFragments 构建我的所有片段,这对蜂窝非常有用……它让我可以灵活地将任何内容作为对话框或“全屏”元素.

我现在已经合并了兼容性工具包,并将我的导入和方法调用移到了那里。现在我在 2.3 上,我正在尝试启动相同的意图,但我收到了这个问题:

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

DialogFragment 的文档建议当您不需要对话框/弹出功能时,它可以作为 Fragment 执行。

【问题讨论】:

    标签: android android-layout android-3.0-honeycomb android-fragments


    【解决方案1】:

    我设法在兼容包的DialogFragment.java 中正确解决了这个问题:

    更改第 74 行: boolean mShowsDialog = false;

    注释掉第 232 行://mShowsDialog = mContainerId == 0;

    然后把两个show方法改成这样:

    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;
    }
    

    基本上,他们确实写了支持,但是在对话框/嵌入之间切换的切换不起作用。

    所以这里我们默认为嵌入,然后设置为在我们显示之前显示为对话框。

    【讨论】:

    • 另外:onSaveInstanceState 应该只保存mShowsDialog 如果它是true。您只需从if 中删除!
    • 此变更集基于哪个修订版(又名来自android.googlesource.com/platform/frameworks/support 的 SHA1 提交 ID)?我正在尝试使用当前版本的支持库重现您的修复,但无法正确执行此操作,因为显然 Google 没有使用他们用于发布的 r 修订代码进行标记。我已经尝试过提交 863d7b4。
    • 我的意思是:我已经将您的变更集与提交 863d7b4 进行了比较。
    • 将您的更改合并到 DialogFragment 并不能为我修复 IllegalStateException。顺便说一句,我尝试将 DialogFragment 显示为 Dialog。
    • 刚刚检查了支持库的 v11 并且仍然有这个错误
    【解决方案2】:

    可以使用android.support.v4.app.DialogFragment版本,请查看here

    【讨论】:

      【解决方案3】:

      我也遇到了同样的问题。我从未找到“正确”的解决方案,但您可以通过在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);
      }
      

      【讨论】:

        【解决方案4】:

        我正在使用 DialogFragment 子类并在 onCreate() 中执行此技巧。我在调用 onCreate() 之前调用 setShowsDialog()(在我的 Activity 的 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);
            }
        }
        

        【讨论】:

          【解决方案5】:

          您是否查看了应用说明?它显示了嵌入对话框的推荐方式,我已经验证这适用于 2.2.1。

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

          我的片段布局必须更改以符合要求,但它既快速又简单。能够在 XML 中定义对话框片段并期望它在没有任何额外工作的情况下被嵌入是更自然的(因为上面对 Compat API 的更改将支持);并且仅在通过 show() 调用时期望模态行为。我想这不是当前的行为。

          【讨论】:

            猜你喜欢
            • 2016-04-05
            • 2012-07-24
            • 1970-01-01
            • 2012-07-22
            • 2011-11-02
            • 1970-01-01
            • 1970-01-01
            • 2011-11-04
            • 1970-01-01
            相关资源
            最近更新 更多