Диалоговые фрагменты с уровнем api устройств < 11

#android #android-layout #android-3.0-honeycomb #android-fragments

#Android #android-макет #android-3.0-honeycomb #android-фрагменты

Вопрос:

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

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

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

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

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

Ответ №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;
}
  

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

Итак, здесь по умолчанию используется значение embedded, а затем устанавливается значение show в виде диалогового окна непосредственно перед его показом.

Комментарии:

1. Также: onSaveInstanceState следует сохранять только mShowsDialog , если это true . Вам нужно только удалить ! из if .

2. В какой редакции (он же идентификатор фиксации SHA1 из android.googlesource.com/platform/frameworks/support ) основан ли этот набор изменений на? Я пытаюсь воспроизвести ваше исправление с помощью текущей версии библиотеки поддержки, но у меня возникли проблемы с выполнением этого правильно, поскольку, по-видимому, Google не пометил код редакции r <n>, который они используют для выпусков. Я пробовал с фиксацией 863d7b4.

3. Я имел в виду: я сравнил ваш набор изменений с фиксацией 863d7b4.

4. Включение ваших изменений в DialogFragment не устраняет исключение IllegalStateException для меня. Кстати, я пытаюсь показать диалоговый фрагмент как диалоговое окно.

5. только что проверил версию 11 библиотеки поддержки, и все еще есть эта ошибка

Ответ №2:

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

Ответ №3:

У меня была такая же проблема. Я так и не нашел «правильного» решения, но вы можете сделать то же самое, установив тему диалога в OnCreateDialog() . При установке темы на android.R.style.Theme_Holo_DialogWhenLarge диалоговое окно будет отображаться как диалоговое окно на больших экранах и xlarge, в то время как на маленьких и обычных экранах оно будет отображаться как полноэкранное окно.

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_DialogWhenLarge);
}
  

Ответ №4:

Я использую дочерний класс 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);
    }
}
  

Ответ №5:

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

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

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