私のアプリでは、PreferencesScreenをネストしています
<PreferencesScreen>
<PreferencesScreen android:key="application">
</PreferencesScreen>
</PreferencesScreen>
今、私は現在の状態からアプリケーション設定の従属画面に直接移動するために起動Intent
したいと思います。Activity
これどうやってするの?
私のアプリでは、PreferencesScreenをネストしています
<PreferencesScreen>
<PreferencesScreen android:key="application">
</PreferencesScreen>
</PreferencesScreen>
今、私は現在の状態からアプリケーション設定の従属画面に直接移動するために起動Intent
したいと思います。Activity
これどうやってするの?
私のアプリケーションでは、PreferencesScreen
プログラムで第 2 レベルを表示する同様のタスクがあります。私がしたこと:
で、表示したい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;
}
}
}
1 つのコメント... 2 番目のレベルだけ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);
これは、アクティビティ インスタンスが異なる限り機能することに注意してください。1 つのインスタンスがメインの設定画面用で、別のインスタンスが内部画面用です。このように、「launch」パラメーターを指定せずにアクティビティを開始すると、常にデフォルトの切り替えケースに陥り、メインの設定画面を設定する必要はありません。ここでの問題は、最初に内部設定画面から開始するアクティビティを実行してから、一般的な (ルート) 設定画面を要求する同じアクティビティを (たとえば、singleInstance フラグを使用して) 起動すると、findPreference を呼び出すことができないことです。 () は、子設定画面内からルート設定画面を見つけるためのものです。
まあ、あまり混乱していないことを願っています;-)
私が使用する方法は、ネストさPreferenceScreen
れたものを別のXMLファイルに入れて、他ので使用することPreferenceActivity
です。この場合、を使用して設定からこの画面に移動し、別のから通常の方法でPreference.setIntent()
これを開始できます。Activity
Activity