在我的应用我有嵌套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 ()从子喜好屏幕中查找根偏好屏幕。
那么,希望没有太多混淆;-)