Android - укажите тему каждого фрагмента

Я пытаюсь написать приложение, используя подход, состоящий из нескольких фрагментов активности. На некоторых страницах должна быть полупрозрачная панель инструментов, на других - нет.

new MyFragment(isTranslucentToolbar)

Но свойство темы принадлежит приложению.

<application
    android:allowBackup = "true"
    android:icon = "@mipmap/ic_launcher"
    android:supportsRtl = "true"
    android:theme = "@style/AppTheme">

Если я установлю это свойство, как показано ниже, я не смогу изменить тему фрагмента.

<style name = "AppTheme" parent = "@style/Theme.AppCompat.Light">
    <item name = "windowActionBar">false</item>
    <item name = "windowNoTitle">true</item>
    <item name = "android:windowDisablePreview">true</item>
</style>



<style name = "AppTheme.Transparent" parent = "AppTheme">
    <item name = "windowActionBarOverlay">true</item>
    <item name = "android:windowTranslucentStatus">true</item>
</style>

Если я установлю тему как прозрачную, как мне создать фрагмент с непрозрачной панелью инструментов? Я могу программно настроить значения полей и отступов корневого макета фрагмента и цвета строки состояния.

Это какой-нибудь способ решения этой задачи?

3
0
5 617
3

Ответы 3

Сохраните обычную тему с включенным ActionBar.

Если вы хотите скрыть / показать ActionBar:

activity.getSupportActionBar().hide(); //for AppCompatActivity
activity.getActionBar().hide(); //for Activity

activity.getSupportActionBar.show(); //for AppCompatActivity
activity.getActionBar().show(); //for Activity

Если вы хотите изменить прозрачность строки состояния:

activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

@ us2956, может, ты разместишь фото того, что хочешь?

TheWanderer 09.09.2018 16:07

В вашем фрагменте

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   getContext().getTheme().applyStyle(R.style.AppTheme_Transparent, true); 
   View view = inflater.inflate(R.layout.Your_fragment_layout, container, false);
   return view;
}

@ ʍѳђ ઽ ૯ ท не влияет на строку состояния

us2956 10.09.2018 10:35

Я бы просто определил панель приложений в каждом фрагменте и использовал тему без панели действий .NoActionBar. Тогда оболочка контекста также повлияет на панель приложений. Конечно, он добавляет дополнительный код, но сохраняет тему от фрагмента отдельно от темы активности.

Jure Sencar 11.09.2020 10:35

попробуйте метод setTheme() в своем java файле

РЕДАКТИРОВАТЬ 1:

Настройка темы в манифесте обычно используется для Activity.

Если вы хотите установить тему для фрагмента, добавьте следующий код в onCreateView () фрагмента:

@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);
}

Также попробуйте этот сегмент кода, если описанное выше не работает.

View decorView = getWindow().getDecorView();
        // Hide the status bar.
        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
Toolbar toolbar = view.findViewById(R.id.toolbar); toolbar.setTitle("Fragment toolbar"); ((AppCompatActivity)getActivity()).setSupportActionBar(toolb‌​ar); getContext().getTheme().applyStyle(R.style.MyTranparentTheme‌​, true); ((AppCompatActivity)getActivity()).getSupportActionBar().set‌​DisplayHomeAsUpEnabl‌​ed(true); ((AppCompatActivity)getActivity()).getSupportActionBar().set‌​BackgroundDrawable(n‌​ew ColorDrawable(ContextCompat.getColor(getContext(), R.color.translucentColor))); setTheme или applyTheme не работают для прозрачной строки состояния.
us2956 10.09.2018 10:50

@ us2956 Я отредактировал ответ. Проверить, работает ли код

Anchit 10.09.2018 18:36

Другие вопросы по теме