7

私のアプリでは、PreferencesScreenをネストしています

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

    </PreferencesScreen>
</PreferencesScreen>

今、私は現在の状態からアプリケーション設定の従属画面に直接移動するために起動Intentしたいと思います。Activityこれどうやってするの?

4

4 に答える 4

6

私のアプリケーションでは、PreferencesScreenプログラムで第 2 レベルを表示する同様のタスクがあります。私がしたこと:

  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;
            }
        }
    }
    

1 つのコメント... 2 番目のレベルだけPreferencesScreenでなく、設定階層全体がここに読み込まれました。ボタンをBack押すと、最初の(親)PreferencesScreenが表示されます。私の場合、それはまさに私が必要としていたものでした。あなたのことはわかりません。

于 2011-03-10T18:16:44.820 に答える
4

子画面を前に取得して問題を処理する方法を次に示します。

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;
        }
    }

    // ...
于 2011-08-03T12:44:10.390 に答える
4

この方法でまったく同じ問題を解決しました。

あなたの好みの活動で:

@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 を呼び出すことができないことです。 () は、子設定画面内からルート設定画面を見つけるためのものです。

まあ、あまり混乱していないことを願っています;-)

于 2011-08-05T16:53:26.090 に答える
3

私が使用する方法は、ネストさPreferenceScreenれたものを別のXMLファイルに入れて、他ので使用することPreferenceActivityです。この場合、を使用して設定からこの画面に移動し、別のから通常の方法でPreference.setIntent()これを開始できます。ActivityActivity

于 2011-03-10T06:56:11.583 に答える