DialogFragment с устройствами уровня API <11 - PullRequest
9 голосов
/ 12 апреля 2011

Я нахожусь в процессе создания сотового проекта / вилки, обратно совместимого с 1.6 +.

Основываясь на документации, предоставленной Google / Android, я решил собрать все свои фрагменты из DialogFragment s, которые отлично работали для сотовой структуры ... это дает мне гибкость, чтобы поместить что-либо в качестве элемента диалога или «полного экрана» ,

Теперь я включил комплект совместимости и перенес свои импорты и вызовы методов на это. Теперь, когда я нахожусь на 2.3, я пытаюсь запустить то же самое намерение, но я получаю эту проблему:

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

Документация для DialogFragment предполагает, что он может работать как Fragment, когда вам не нужны функции диалога / всплывающих окон.

Ответы [ 5 ]

9 голосов
/ 27 сентября 2011

Мне удалось исправить это в 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;
}

По сути, они написали в поддержку, но переключение между диалоговым / встроенным не работает.

Так что здесь мы по умолчаниюво встроенный, а затем установите для отображения в виде диалога непосредственно перед тем, как мы его показываем.

3 голосов
/ 24 декабря 2013

Вы можете использовать версию android.support.v4.app.DialogFragment, пожалуйста, отметьте здесь

2 голосов
/ 12 июня 2012

Я использую дочерний класс DialogFragment и выполняю этот трюк в onCreate (). Я вызываю setShowsDialog () перед вызовом onCreate () (в onAttachFragment () моей 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);
    }
}
2 голосов
/ 18 апреля 2011

У меня была такая же проблема. Я никогда не находил «правильного» решения, но вы можете сделать то же самое, установив тему диалога в 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 голосов
/ 11 апреля 2012

Вы проверили примечание к приложению? Он показывает рекомендуемый способ встраивания диалога, и я проверил, что это работает на 2.2.1.

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

Мое расположение фрагментов должно было измениться, чтобы соответствовать, но это было быстро и легко. Более естественно иметь возможность определять фрагмент диалога в XML и ожидать, что он будет внедрен без какой-либо дополнительной работы (как поддержали бы вышеуказанные изменения в Compat API); и ожидать только модальное поведение при вызове через show (). Я полагаю, что это не текущее поведение.

...