DialogFragments with devices api level < 11

2019-02-04 23:01发布

I am in the process of making a honeycomb project/fork backwards compatible with 1.6+.

Based on the documentation provided by Google/Android I decided to build off all my fragments off DialogFragments which worked great for honeycomb...it gives me the flexibility to put anything as a dialog or 'full screen' element.

I've now incorporated the compatibility kit and moved my imports and method calls over to that. Now that I'm on 2.3 I am trying to launch an identical intent but I receive this issue:

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

The documentation for DialogFragment suggests that it can perform as Fragment when you don't desire the dialog/popup functionality.

5条回答
孤傲高冷的网名
2楼-- · 2019-02-04 23:25

Did you check the application note? It shows a recommended way of embedding a dialog, and I've verified this works on 2.2.1.

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

My fragment layout had to change to conform but it was quick and easy. It's more natural to be able to define the dialog fragment in XML and expect it to be embedded without any extra work (as the above changes to Compat API would support); and to only expect modal behavior when called through show(). I suppose that isn't the current behavior.

查看更多
该账号已被封号
3楼-- · 2019-02-04 23:32

You can use the android.support.v4.app.DialogFragment version, please check here

查看更多
时光不老,我们不散
4楼-- · 2019-02-04 23:43

I've had the same problem. I never found a "correct" solution, but you can do the same thing by setting the theme of the Dialog in OnCreateDialog(). By setting the theme to android.R.style.Theme_Holo_DialogWhenLarge the dialog will be shown as a dialog on large and xlarge screens, while it'll be shown as a full screen window on small and normal screens.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_DialogWhenLarge);
}
查看更多
Evening l夕情丶
5楼-- · 2019-02-04 23:46

I managed to fix this properly in DialogFragment.java of the Compatibility Package:

Change line 74: boolean mShowsDialog = false;

Comment out line 232: //mShowsDialog = mContainerId == 0;

Then change the two show methods to this:

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

Basically, they did write in support but the toggle to switch between dialog/embedded doesn't work.

So here we default to embedded, and then set to show as a dialog just before we show it.

查看更多
小情绪 Triste *
6楼-- · 2019-02-04 23:48

I am using a DialogFragment child class and doing this trick in the onCreate() works. I call setShowsDialog() before onCreate() is called (in the onAttachFragment() of my Activity)

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);
    }
}
查看更多
登录 后发表回答