Intereting Posts
Проблема с RelativeLayout, когда View view – View.GONE Переход от одного действия к другому. Активность в Android. Сглаженные закругленные углы на Android ImageView Отсутствует информация о проекте «Грейдл». Проверьте, успешно ли IDE успешно синхронизировала свое состояние с моделью проектора Gradle Обновление Android Studio 2.1 Preview3: невозможно настроить расширение публикации после того, как он был достигнут Пользовательский интерфейс зависает с сообщениями GC Запрос поставщика контента для Android из командной строки (оболочка adb) Тема. Прерывание не выполняется на ICS Android onCreate onResume Предотвратить показ изображений в ImageView Можете ли вы запрашивать разрешения синхронно в модели разрешений на запуск приложений Android Marshmallow (API 23)? Android: использование линейного градиента в качестве фонового изображения Масштабирование шрифтов Android WebView iFrame Загрузка файлов с android на wcf Эффект fitsSystemWindows пропал для фрагментов, добавленных через FragmentTransaction

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

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

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

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

Solutions Collecting From Web of "Как перейти к вложенному PreferencesScreen"

В моем приложении у меня есть аналогичная задача, чтобы программно отображать 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 .