Я построил меню настроек, используя PreferenceFragmentCompat. Выбор пункта в меню настроек запускает новый фреймворк (например, страницу справки).
Некоторое время назад у меня была проблема, когда пользователь поворачивал устройство на одной из страниц справки, он отбрасывал его назад. в главное меню предпочтений, а не оставаться на экране справки. Я «исправил» это, добавив android:configChanges="orientation"
к Активности настроек в AndroidManifest. xml. Это работало нормально, но теперь я добавил еще одну страницу из меню настроек, в которой есть отдельный файл макета для горизонтального вида (там довольно много элементов, поэтому мне нужен другой макет для ориентации).
Проблема, с которой я столкнулся, заключается в том, что когда я на этой странице, и пользователь поворачивается в альбомную ориентацию, я хочу, чтобы представление использовало этот новый макет, но это не так, потому что действие не перезапускается (из-за строки в манифесте). ). Файл макета с альбомной ориентацией используется только в том случае, если пользователь входит в меню «Настройки» в ландшафтном режиме.
Поэтому мне необходимо:
- Если я на странице справки с несколькими макетами и пользователь поворачивает устройство, каким-то образом принудительно использует макет
- Удаляет
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());
}
}
}
}