Пытаюсь задать тему для фрагмента.
Установка темы в манифесте не работает:
android:theme="@android:style/Theme.Holo.Light"
Глядя на предыдущие блоги, кажется, что мне нужно использовать ContextThemeWrapper. Может ли кто-нибудь сослаться на закодированный пример? Я ничего не могу найти.
android
android-fragments
android-theme
user1232691
источник
источник
Фрагмент берет свою тему из Activity. Каждому фрагменту назначается тема Деятельности, в которой он существует.
Тема применяется в методе Fragment.onCreateView, где ваш код создает представления, которые на самом деле являются объектами, в которых используется тема.
В Fragment.onCreateView вы получаете параметр LayoutInflater, который расширяет представления и содержит контекст, используемый для темы, на самом деле это Activity. Итак, ваши раздутые представления используют тему Activity.
Чтобы переопределить тему, вы можете вызвать LayoutInflater.cloneInContext , который упоминает в Документах, что его можно использовать для изменения темы. Вы можете использовать здесь ContextThemeWrapper. Затем используйте клонированный надувной элемент для создания представлений фрагментов.
источник
Для применения единого стиля я использовал только
в
onCreateView()
фрагменте, прежде чем раздувать корневой вид фрагмента, и это работает для меня.источник
getContext()
Я также пытался отобразить диалоговое окно моего фрагмента с темой, отличной от его активности, и следовал этому решению . Как и некоторые люди, упомянутые в комментариях, я не заставлял его работать, и диалог продолжал отображаться с темой, указанной в манифесте. Проблема оказалась в том , что я строила диалог , используя
AlertDialog.Builder
вonCreateDialog
способе и поэтому не делает использованиеonCreateView
метода , как показано в ответ , что я связан с. И когда я создавал экземпляр,AlertDialog.Builder
я передавал в контексте using,getActivity()
когда я должен был использоватьConstextThemeWrapper
вместо этого экземпляр .Вот код моего onCreateDialog:
Изначально у меня был
AlertDialog.Builder
экземпляр, созданный следующим образом:который я изменил на:
После этого изменения диалог фрагмента был показан с правильной темой. Итак, если у кого-то еще есть аналогичная проблема и он использует,
AlertDialog.Builder
то проверьте контекст, передаваемый строителю. Надеюсь это поможет! :)источник
Убедитесь, что вы
android:minSdkVersion="11"
установили в своем манифесте. Это могло быть причиной того, что пример Дэвида вам не подошел.Кроме того, установите
android:theme="@android:style/Theme.Holo.Light"
атрибут для<application>
тега, а НЕ для<activity>
тега.Другая возможная проблема может заключаться в способе получения контекста при использовании файла
ContextThemeWrapper()
. Если вы используете что-то вроде,getActivity().getApplicationContext()
просто замените его наgetActivity()
.Обычно Theme.Holo должен применяться к фрагментам, связанным с MainActivity.
Обратите внимание, что вы используете ContextThemeWrapper, когда хотите применить другую тему для своего фрагмента. Может помочь, если вы предоставите фрагмент кода из MainActivity, куда вы добавляете свои фрагменты.
Полезные ссылки:
Пользовательский ListView во фрагменте не соответствует родительской теме
источник
Я попробовал решение, которое, по мнению Дэвида, работает, но не во всех сценариях:
1. для первого фрагмента, добавленного в стек, есть тема действия, а не та, которая определена в onCrateView, а для второго фрагмента, который я добавить в стек правильно их было применено к фрагменту.
2. Во втором фрагменте, который они отображали правильно, я сделал следующее: я принудительно закрыл приложение, очистив память, повторно открыв приложение, и когда действие было воссоздано с фрагментом, фрагмент изменил их неправильно. Activity, а не то же самое, что было установлено в onCrateView фрагмента.
Чтобы решить эту проблему, я сделал небольшое изменение и заменил аргумент контейнера из inflater.inflate нулевым.
Я не знаю, как надувной модуль использует в некоторых сценариях контекст из представления контейнера.
Обратите внимание: я использую android.support.v4.app.Fragment и android.support.v7.app.AppCompatActivity.
источник
Я знаю, что это немного поздно, но это может помочь кому-то другому, потому что это помогло мне. Вы также можете попробовать добавить строку кода ниже внутри функции onCreatView фрагмента
источник
Создайте класс java, а затем используйте макет, тему которого вы хотите изменить, в методе onCreate. Затем укажите его в манифесте как обычно.
источник
Если вы просто хотите применить стиль для определенного фрагмента, просто добавьте эти строки перед вызовом
onCreateView()
илиonAttach()
фрагмента,и если вы хотите установить прозрачную строку состояния, установите false для
fitsSystemWindows
свойства вашего корневого макета,источник
Я заставил его работать, установив тему в контексте фрагмента перед вызовом инфлятора.
ПРИМЕЧАНИЕ. Это пример для Xamarin.Android в сочетании с MvvmCross. Я не уверен на 100%, что это сработает и для Java-программистов. Но можно попробовать :)
Код метода расширения SetTheme
Надеюсь, это поможет некоторым людям, ура!
источник
Решил проблему, используя
android:theme = "@style/myTheme"
в файле макета фрагмента. Например, это изменяет стильLinearLayout
и его содержимое, но ничего кромеLinearLayout
. Итак, чтобы оформить весь фрагмент каким-либо стилем, примените тему к его самому внешнему родительскому макету.Примечание: на всякий случай, если вы еще не нашли решения, вы можете попробовать.
источник
вы можете попробовать это для леденца на палочке в onAttach
последнее окно window = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)
и верните его по умолчанию в ondettach
источник