DialogFragments с уровнем API устройств ‹ 11

Я занимаюсь созданием сотового проекта/форка, обратно совместимого с 1.6+.

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

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

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

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


person Joey    schedule 12.04.2011    source источник


Ответы (5)


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

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

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

person Chris Banes    schedule 26.09.2011
comment
Также: onSaveInstanceState должен сохранять mShowsDialog только в том случае, если это true. Вам нужно только удалить ! из if. - person Jake Wharton; 21.10.2011
comment
На какой ревизии (она же идентификатор фиксации SHA1 из android.googlesource.com/platform/frameworks/support) на чем основан этот набор изменений? Я пытаюсь воспроизвести ваше исправление с помощью текущей версии библиотеки поддержки, но не могу сделать это правильно, так как, по-видимому, Google не пометил код версии r‹n›, который они используют для выпусков. Я пробовал с фиксацией 863d7b4. - person arne.jans; 19.12.2012
comment
Я имел в виду: я сравнил ваш набор изменений с коммитом 863d7b4. - person arne.jans; 19.12.2012
comment
Включение ваших изменений в DialogFragment не исправляет IllegalStateException для меня. Кстати, я пытаюсь показать DialogFragment как диалог. - person arne.jans; 19.12.2012
comment
Эти исправления были сделаны 13 месяцев назад. С тех пор Google исправил это самостоятельно. - person Chris Banes; 20.12.2012
comment
только что проверил v11 библиотеки поддержки и все еще имеет эту ошибку - person 4ntoine; 17.01.2013
comment
Тоже все еще вижу это. Доступны ли какие-либо другие решения? - person cottonBallPaws; 10.01.2014
comment
Derp, у меня была эта проблема, потому что я переопределял getView в своем фрагменте и возвращал неправильное представление, которое имело родительское представление. Это вызвало сбой в моем случае. - person cottonBallPaws; 10.01.2014

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

person Dan    schedule 24.12.2013

У меня была такая же проблема. Я так и не нашел «правильного» решения, но вы можете сделать то же самое, установив тему диалога в 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);
}
person Kaloer    schedule 18.04.2011

Я использую дочерний класс DialogFragment и делаю этот трюк в onCreate(). Я вызываю setShowsDialog() до вызова onCreate() (в 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);
    }
}
person robUx4    schedule 12.06.2012

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

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

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

person Tenacious    schedule 11.04.2012