#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 () . Я полагаю, что это не текущее поведение.