在我的應用我有嵌套PreferencesScreen的如何導航到嵌套PreferencesScreen
<PreferencesScreen>
<PreferencesScreen android:key="application">
</PreferencesScreen>
</PreferencesScreen>
現在我想火Intent
把我從currrent Activity
直接嚮應用程序首選項子屏幕。我怎樣才能做到這一點?
在我的應用我有嵌套PreferencesScreen的如何導航到嵌套PreferencesScreen
<PreferencesScreen>
<PreferencesScreen android:key="application">
</PreferencesScreen>
</PreferencesScreen>
現在我想火Intent
把我從currrent Activity
直接嚮應用程序首選項子屏幕。我怎樣才能做到這一點?
我使用的方法是將嵌套的PreferenceScreen
放入一個單獨的XML文件並在其他PreferenceActivity
中使用它。在這種情況下,您可以使用Preference.setIntent()
從首選項導航到此屏幕,並以另一種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);
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);
要注意的是這個工程只要活動情況是不同的:一個實例爲主要首選項屏幕,另一個爲內部屏幕。通過這種方式,當您在沒有「啓動」參數的情況下啓動活動時,您總是會進入默認開關狀態,並且永遠不需要設置主要首選項屏幕。這裏的問題是,如果您首先運行以內部前導屏幕開始的活動,然後發出SAME活動(例如,使用標誌singleInstance)詢問一般(根)前導屏幕,則無法調用findPreference ()從子喜好屏幕中查找根偏好屏幕。
那麼,希望沒有太多混淆;-)