Как перейти к вложенному PreferencesScreen

В моем приложении у меня есть вложенные PreferencesScreen's

<PreferencesScreen> <PreferencesScreen android:key="application"> </PreferencesScreen> </PreferencesScreen> 

Теперь я хочу запустить Intent чтобы перенести меня из Activity Activity прямо в подэкран настроек приложений. Как я могу это сделать?

В моем приложении у меня есть аналогичная задача, чтобы программно отображать PreferencesScreen второго уровня. Что я сделал:

  1. В preferences.xml я назначил ключ PreferencesScreen я хочу показать (как показано в вопросе).

  2. Чтобы показать PreferencesScreen я написал:

     final Intent preferencesActivity = new Intent(getBaseContext(), MyPreferencesActivity.class); preferencesActivity.putExtra("PREFERENCE_SCREEN_KEY", "key_of_preference_screen_to_show"); startActivity(preferencesActivity); 
  3. Затем в моем классе PreferenceActivity в методе onCreate был добавлен следующий код:

     final Intent intent = getIntent(); final String startScreen = intent.getStringExtra("PREFERENCE_SCREEN_KEY"); if (startScreen != null) { getIntent().removeExtra("PREFERENCE_SCREEN_KEY"); final Preference preference = findPreference(startScreen); final PreferenceScreen preferenceScreen = getPreferenceScreen(); final ListAdapter listAdapter = preferenceScreen.getRootAdapter(); final int itemsCount = listAdapter.getCount(); int itemNumber; for (itemNumber = 0; itemNumber < itemsCount; ++itemNumber) { if (listAdapter.getItem(itemNumber).equals(preference)) { preferenceScreen.onItemClick(null, null, itemNumber, 0); break; } } } 

Одно замечание … Здесь были загружены не только PreferencesScreen второго уровня, но и вся иерархия настроек. Итак, если вы нажмете кнопку « Back , появится первый (родительский) PreferencesScreen . В моем случае это было именно то, что мне нужно. Не уверен в твоем.

Вот способ справиться с проблемой, схватив детский экран впереди:

 public class MyChildPreferenceActivity extends PreferenceActivity { private String screenKey = "myChildScreenKey"; @Override public PreferenceScreen getPreferenceScreen() { PreferenceScreen root = super.getPreferenceScreen(); if (root != null) { PreferenceScreen match = findByKey(root, screenKey); if (match != null) { return match; } else { throw new RuntimeException("key " + screenKey + " not found"); } } else { return null; } } private PreferenceScreen findByKey(PreferenceScreen parent, String key) { if (key.equals(parent.getKey())) { return parent; } else { for (int i = 0; i < parent.getPreferenceCount(); i++) { Preference child = parent.getPreference(i); if (child instanceof PreferenceScreen) { PreferenceScreen match = findByKey((PreferenceScreen) child, key); if (match != null) { return match; } } } return null; } } // ... 

Я решил эту же проблему таким образом.

В вашей деятельности предпочтения:

 @Override protected void onResume() { super.onResume(); int startingPage = getIntent().getIntExtra(Constants.PREFS_STARTING_PAGE, 0); switch (startingPage) { case Constants.MY_PREF_SCREEN_1: setPreferenceScreen((PreferenceScreen)findPreference(getString(R.string.PREF_SCREEN_1))); break; case Constants.MY_PREF_SCREEN_2: setPreferenceScreen((PreferenceScreen)findPreference(getString(R.string.PREF_SCREEN_2))); break; default: // Nothing to do, but read the warning below. } } 

Затем вы можете открыть экран внутренних предпочтений с чем-то вроде этого:

  Intent prefIntent = new Intent(ctx, MyPreferenceActivity.class); prefIntent.putExtra(Constants.PREFS_STARTING_PAGE, Constants.MY_PREF_SCREEN_1); startActivity(prefIntent); 

Остерегайтесь, что это работает до тех пор, пока экземпляры действий различны: один экземпляр для экрана основной настройки и другой для внутреннего экрана. Таким образом, когда вы начинаете свою деятельность без параметра «запуска», вы всегда попадаете в корпус переключателя по умолчанию и никогда не должны устанавливать основной экран настроек. Проблема здесь в том, что если вы сначала запускаете действие, начиная с внутреннего экрана pref, а затем выполняете одно из действий (например, с флажком singleInstance), запрашивая общий (корневой) экран pref, вы не можете вызвать findPreference (), Чтобы найти экран предпочтений корней из экрана дочерних предпочтений.

Ну, надеюсь, что не слишком много путаницы 😉

Способ, которым я использую, – вставить вложенные PreferenceScreen в отдельный XML-файл и использовать его в другой PreferenceActivity . В этом случае вы сможете перейти на этот экран из настроек с помощью Preference.setIntent() и запустить эту Activity обычным способом из другого Activity .

Intereting Posts
Экземпляр эмулятора Gingerbread намного более вялый, чем Froyo и ниже. Зачем? Поддержка других протоколов в веб-браузере Android JSON VS простая манипуляция строк для синтаксического анализа HttpRequest в Android Любой совместный инструмент / веб-сайт для локализации приложения для Android? Документация для виджетов на главном экране Android Появится ли это приложение в Play Маркете? Отправка данных из вложенных фрагментов в родительский фрагмент Метод Gradle DSL не найден: 'apt ()' SoLoader $ WrongAbiError с React Native Android Как плавно поворачивать карту с помощью подшипника в android Получить изображение Uri + миниатюра картинки, снятой камерой на Android Пользовательский горизонтальный индикатор растрового изображения Android растягивается Как «подождать» темы в Android Отказался от загрузки сценария, поскольку он нарушает следующую политику политики безопасности контента Android MVP WeakRefrence