В моем приложении у меня есть вложенные PreferencesScreen's
<PreferencesScreen> <PreferencesScreen android:key="application"> </PreferencesScreen> </PreferencesScreen>
Теперь я хочу запустить Intent
чтобы перенести меня из Activity Activity
прямо в подэкран настроек приложений. Как я могу это сделать?
В моем приложении у меня есть аналогичная задача, чтобы программно отображать PreferencesScreen
второго уровня. Что я сделал:
В preferences.xml
я назначил ключ PreferencesScreen
я хочу показать (как показано в вопросе).
Чтобы показать PreferencesScreen
я написал:
final Intent preferencesActivity = new Intent(getBaseContext(), MyPreferencesActivity.class); preferencesActivity.putExtra("PREFERENCE_SCREEN_KEY", "key_of_preference_screen_to_show"); startActivity(preferencesActivity);
Затем в моем классе 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
.