Как использовать альбомную компоновку при вращении устройства в меню настроек? - PullRequest
0 голосов
/ 09 января 2020

Я построил меню настроек, используя PreferenceFragmentCompat. Выбор пункта в меню настроек запускает новый фреймворк (например, страницу справки).

Некоторое время назад у меня была проблема, когда пользователь поворачивал устройство на одной из страниц справки, он отбрасывал его назад. в главное меню предпочтений, а не оставаться на экране справки. Я «исправил» это, добавив android:configChanges="orientation" к Активности настроек в AndroidManifest. xml. Это работало нормально, но теперь я добавил еще одну страницу из меню настроек, в которой есть отдельный файл макета для горизонтального вида (там довольно много элементов, поэтому мне нужен другой макет для ориентации).

Проблема, с которой я столкнулся, заключается в том, что когда я на этой странице, и пользователь поворачивается в альбомную ориентацию, я хочу, чтобы представление использовало этот новый макет, но это не так, потому что действие не перезапускается (из-за строки в манифесте). ). Файл макета с альбомной ориентацией используется только в том случае, если пользователь входит в меню «Настройки» в ландшафтном режиме.

Поэтому мне необходимо:

  1. Если я на странице справки с несколькими макетами и пользователь поворачивает устройство, каким-то образом принудительно использует макет
  2. Удаляет android:configChanges="orientation" из манифеста, но каким-то образом go возвращается на страницу, на которой был пользователь, когда они поворачивали устройство

Возможен ли какой-либо из этих вариантов, если да, то как? Вот мой код:

НастройкиActivity. java

public class SettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        getSupportFragmentManager()
                .beginTransaction()
                .replace(android.R.id.content, new SettingsMenuFragment())
                .commit();
    }
}

SettingsMenuFragment. java

public class SettingsMenuFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle bundle, String s) {
        addPreferencesFromResource(R.xml.app_preferences);

        Preference helpPreference = findPreference("keyHelp");
        Preference aboutPreference = findPreference("keyAbout");

        helpPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {

                int id = ((ViewGroup)getView().getParent()).getId();

                Fragment newFragment = new HelpPage();
                FragmentTransaction transaction = getFragmentManager().beginTransaction();

                transaction.replace(id, newFragment, "HELP_FRAGMENT");
                transaction.addToBackStack(null);
                transaction.commit();

                return true;
            }
        });

        aboutPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            ....as above....
        }

    @Override
    public void onResume(){
        super.onResume();
    }
}

HelpPage. java

public class HelpPage extends Fragment  {

    TextView helpText;
    View v;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        setHasOptionsMenu(false);
        v = inflater.inflate(R.layout.preferences_help, container, false);
        helpText = v.findViewById(R.id.help_text_view);
        helpText.setText(Html.fromHtml(getString(R.string.preferenceHelpText)));

        return v;
    }

}

AndroidManifest. xml

<activity
    android:name="SettingsActivity"
    android:configChanges="orientation">
</activity>

**** ОБНОВЛЕНИЕ ****

Итак, после небольшой игры, я нашел решение, но оно не похоже на правильное, и мне пришлось внести некоторые хакерские изменения в бэкстек. Мои настройки активности. java теперь выглядит так:

public class SettingsActivity extends AppCompatActivity {

@Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        String tagname;

        if (savedInstanceState != null) {
            tagname = savedInstanceState.getString("TAG");
            int id = findViewById(android.R.id.content).getId();
            Fragment newFragment;
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            switch (tagname){               
                case "AboutPage":
                    newFragment = new AboutPage();
                    transaction.replace(id, newFragment, "ABOUT_FRAGMENT");
                    transaction.addToBackStack(null);
                    transaction.commit();
                    break;
                case "HelpPage":
                   newFragment = new HelpPage();
                    transaction.replace(id, newFragment, "HELP_FRAGMENT");
                    transaction.addToBackStack(null);
                    transaction.commit();
                    break;
            }

            Fragment frg = getSupportFragmentManager().findFragmentByTag(tagname);
            FragmentManager manager = this.getSupportFragmentManager();
            FragmentTransaction trans = manager.beginTransaction();
            trans.remove(frg);
            trans.commit();
            manager.popBackStack();
        }

        else {     
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(android.R.id.content, new SettingsMenuFragment())
                    .commit();
            }
    }

   @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                if (fragment != null && fragment.isVisible()) {
                                    getSupportFragmentManager().putFragment(outState, "KEY", fragment);
                    outState.putString("TAG", fragment.getTag());
                }
            }
        }
    }
...