Как работать с предпочтениями в дизайне одного действия с использованием компонента навигации?

#android-fragments #android-activity #android-toolbar #android-preferences #android-navigation

#android-фрагменты #android-activity #android-панель инструментов #android-настройки #android-навигация

Вопрос:

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

Мои требования: мне нужно раздуть панель инструментов и список предпочтений во фрагменте. Мои подходы:

  1. Добавьте предпочтение, используя следующий код.

SettingFragment.java

  @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
      setPreferencesFromResource(R.xml.setting_main, rootKey);
 }
 
  1. Настройте панель приложений для компонента навигации.
      @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
    
         mNavController = Navigation.findNavController(view);
         AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(mNavController.getGraph()).build();
         Toolbar toolbar = view.findViewById(R.id.the_toolbar);
    
         NavigationUI.setupWithNavController(toolbar, mNavController, appBarConfiguration);
     }
     
  2. В теме приложения я использовал макет для предпочтений, который содержит панель инструментов и framelayout.
     <style name="Theme.MyApp" parent="@style/Theme.AppCompat.Light.NoActionBar">
     ...
      <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
    </style>
    
    <style name="PreferenceThemeOverlay">
       <item name="android:layout">@layout/fragment_settings </item>
    </style>
     

fragment_settings.xml

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent">

     <androidx.appcompat.widget.Toolbar
        android:id="@ id/the_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/actionBarSize"
        android:layout_gravity="bottom"
        android:layout_marginBottom="12dp"/>

       <FrameLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:id="@android:id/list_container">
       </FrameLayout>

   </LinearLayout>
 

setting_main.xml

 <androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
   android:key="MyApp"
   android:title="My application">

  <androidx.preference.Preference
    android:icon="@drawable/ic_list1"
    android:key="PreferenceList1"
    android:title="PreferenceList1" />

  <androidx.preference.PreferenceCategory android:key="SecondCategory">

     <androidx.preference.Preference
        android:icon="@drawable/ic_list2"
        android:key="PreferenceList2"
        android:title="PreferenceList2" />

    </androidx.preference.PreferenceCategory>

</androidx.preference.PreferenceScreen>
 

Мои проблемы:
Если я это сделаю, я смогу успешно добавить панель инструментов и настройки. Но я вижу мигающую проблему в заголовке во время транзакции от одного фрагмента к другому.

Я много искал, но не нашел подходящих решений. Я новичок.

Мои вопросы:

  1. Как я могу решить эту проблему?
  2. Есть ли какой-либо способ работать с предпочтениями в навигационном компоненте, у которого также есть панель инструментов и предпочтения во фрагменте?
  3. Для других фрагментов, у которых нет предпочтений, я могу раздуть, используя этот код, который отлично работает без проблем с миганием. Есть ли какие-либо способы сделать это для предпочтений, которые также соответствуют моим требованиям?
      @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable 
      Bundle savedInstanceState) {
      return inflater.inflate(R.layout.setting_main_fragment, container, false);
    }
     

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

1. Все еще застрял в этой проблеме, с нетерпением ожидая обратной связи