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 DialogFragment
s 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.
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.
You can use the android.support.v4.app.DialogFragment version, please check here
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);
}
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);
}
}
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.