Установить тему для fragmentа
Я пытаюсь установить тему для fragmentа.
Установка темы в манифесте не работает:
android:theme="@android:style/Theme.Holo.Light"
От взгляда на предыдущие блоги, кажется, что я должен использовать ContextThemeWrapper. Может ли кто-нибудь ссылаться на закодированный пример? Я ничего не могу найти.
- Как я могу получить доступ к getSupportFragmentManager () в fragmentе?
- Как получить панель инструментов из fragmentа?
- Получение ошибки «Активность Java.lang.IllegalStateException была уничтожена» при использовании вкладок с ViewPager
- findViewById в fragmentе
- Проблема ViewPager + RecyclerView в android
- Когда fragment fragmentа с SwipeRefreshLayout во время обновления, fragment замерзает, но на самом деле все еще работает
- Начальная активность из fragmentа вызывает NullPointerException
- Как получить существующие fragmentы при использовании FragmentPagerAdapter
- Как добавить функцию «Назад» в WebView внутри fragmentа?
- Дублирование fragmentов на транзакции fragmentов
- Как проверить, является ли вид fragmentа видимым для пользователя?
- Фрагменты onResume из заднего стека
- Как обновить fragment, который имеет Gridview, заполненный Sqlite
Настройка темы в манифесте обычно используется для Activity.
Если вы хотите установить Theme for Fragment, добавьте следующий код в onCreateView () fragmentа:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create ContextThemeWrapper from the original Activity Context with the custom theme final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme); // clone the inflater using the ContextThemeWrapper LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); // inflate the layout using the cloned inflater, not default inflater return localInflater.inflate(R.layout.yourLayout, container, false); }
Я также пытался отобразить диалог своего fragmentа с другой темой в своей деятельности и следовать этому решению . Как и некоторые люди, упомянутые в комментариях, я не получал его на работу, и диалог продолжал показывать тему, указанную в манифесте. Проблема AlertDialog.Builder
в том, что я AlertDialog.Builder
диалог с помощью AlertDialog.Builder
в методе onCreateDialog
и поэтому не использовал метод onCreateView
как показано в ответе, с которым я связан. И когда я AlertDialog.Builder
экземпляр AlertDialog.Builder
я проходил в контексте, используя getActivity()
когда я должен был использовать экземпляр ConstextThemeWrapper
вместо этого.
Вот код для моего onCreateDialog:
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Create ContextThemeWrapper from the original Activity Context ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(getActivity(), android.R.style.Theme_DeviceDefault_Light_Dialog); LayoutInflater inflater = getActivity().getLayoutInflater().cloneInContext(contextThemeWrapper); // Now take note of the parameter passed into AlertDialog.Builder constructor AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper); View view = inflater.inflate(R.layout.set_server_dialog, null); mEditText = (EditText) view.findViewById(R.id.txt_server); mEditText.requestFocus(); // Show soft keyboard automatically mEditText.setOnEditorActionListener(this); builder.setView(view); builder.setTitle(R.string.server_dialog); builder.setPositiveButton(android.R.string.ok, this); Dialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(false); return dialog; }
Первоначально я AlertDialog.Builder
следующим образом:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
который я изменил на:
AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper);
После этого изменения диалог fragmentа был показан с правильной темой. Поэтому, если кто-то другой сталкивается с подобной проблемой и использует использование AlertDialog.Builder
тогда проверьте, что контекст передается строителю. Надеюсь это поможет! 🙂
Фрагмент берет свою тему из своей деятельности. Каждому fragmentу присваивается тема деятельности, в которой она существует.
Тема применяется в методе Fragment.onCreateView, где ваш код создает представления, которые на самом деле являются объектами, в которых используется тема.
В Fragment.onCreateView вы получаете параметр LayoutInflater, который раздувает представления, и он содержит контекст, используемый для темы, на самом деле это Activity. Таким образом, ваши завышенные взгляды используют тему Activity.
Чтобы переопределить тему, вы можете вызвать LayoutInflater.cloneInContext , который упоминает в Документах, что он может использоваться для изменения темы. Здесь вы можете использовать ContextThemeWrapper. Затем используйте клонированный надувной элемент для создания fragmentов fragmentа.
Убедитесь, что у вас установлен android:minSdkVersion="11"
в вашем манифесте. Это может быть причиной того, почему пример Дэвида не сработал для вас.
Также установите атрибут android:theme="@android:style/Theme.Holo.Light"
для
а не тег
.
Другая возможная проблема может заключаться в том, как вы получаете свой контекст при использовании ContextThemeWrapper()
. Если вы используете что-то вроде getActivity().getApplicationContext()
просто замените его на getActivity()
.
Обычно Theme.Holo следует применять к fragmentам, связанным с MainActivity.
Обратите внимание, что вы используете ContextThemeWrapper, когда хотите применить другую тему для своего fragmentа. Это может помочь, если вы предоставите кусок кода, из вашего MainActivity, где вы добавляете свои fragmentы.
Некоторые полезные ссылки:
Пользовательский ListView в fragmentе, не придерживаясь родительской темы
Для применения одного стиля я использовал только
getContext().getTheme().applyStyle(styleId, true);
в onCreateView()
fragmentа до раздувания корневого представления fragmentа, и он работает для меня.
Я попробовал решение, которое Дэвид предположил, что он работает, но не во всех сценариях:
1. для первого fragmentа, добавленного в стек, есть тема активности, а не та, которая определена в onCrateView, но во втором fragmentе, который я добавляю в стек, исправлена их, была применена к fragmentу.
2. На втором fragmentе, что они были отображены правильно, я сделал следующее: я заставил приложение закрыться, очистив память, откройте приложение и когда активность была воссоздана с fragmentом. Фрагмент изменил их неправильные активность, а не то, что было установлено в onCrateView fragmentа.
Чтобы исправить проблему, я сделал небольшое изменение и заменил аргумент контейнера из файла inflater.inflate нулевым.
я не знаю, как надуватель использует в некоторых сценариях контекст из вида контейнера.
Обратите внимание, что im использует android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity.
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create ContextThemeWrapper from the original Activity Context with the custom theme final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme); // clone the inflater using the ContextThemeWrapper LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); // inflate the layout using the cloned inflater, not default inflater return localInflater.inflate(R.layout.yourLayout, null, false); }
Создайте class java, а затем используйте макет, который хотите изменить тему в методе onCreate. Затем укажите его в манифесте как обычный
Я решил проблему, используя android:theme = "@style/myTheme"
в файле макета fragmentа. Например, это изменяет стиль LinearLayout
и его содержимое, но не на стороне LinearLayout
. Итак, чтобы украсить весь fragment любым стилем, примените тему к ее внешнему основному макету.
вы можете попробовать это для lollipop в onAttach
final Window window = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)
и установите его значение по умолчанию в ondettach
Если вы просто хотите применить стиль для определенного fragmentа, просто добавьте эти строки перед вызовом onCreateView()
или onAttach()
fragmentа,
getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); getActivity().getWindow().setStatusBarColor(Color.TRANSPARENT);
и если вы хотите установить прозрачную строку состояния, тогда установите значение false для свойства fitsSystemWindows
корневого макета,
android:fitsSystemWindows="false"