46

XMLで宣言され、がロードされた設定を備えたAndroidアプリケーションがありますaddPreferencesFromResource。ユーザーは設定を開き、各アイテムをクリックして編集することができ、すべて機能します。

私が持っている1つの好みは次のとおりです。

        <ListPreference android:key="abc"
            android:title="@string/abc"
            android:summary="@string/cde"
            android:persistent="true"/>

設定ダイアログをユーザーに自動的に表示するにはどうすればよいですか(ユーザーが設定画面に移動してクリックする必要はありませんか?)。

試し( (android.preference.DialogPreference) prefMgr.findPreference( "abc" )).showDialog(null)ましたが、保護された方法だと言われています...?私の主な活動(これは)からそれを呼んだので、PreferenceActivityそれは明らかに機能しません。しかし、他にどのように?

編集

設定にアクセスするために使用するというアイデアを持つ2つのスレッド(12findViewById )を見つけましたが、成功しませんでした。それは常にnullを返します(私にとってもそうです)。

コードからこれを行う可能性は実際にはないようです。

4

8 に答える 8

37

よりクリーンなアプローチについては、新しく受け入れられた回答を参照してください。これは機能していましたが、実際にはクリーンな方法ではありませんでした。


くそー、数時間かかりましたが、ようやく機能しました。

解決策は文書化されていない呼び出しpublic void onItemClick (...)です。いくつかの引数を取り、この質問で指摘されているように、呼び出したい要素のインデックスに従ってクリックをシミュレートするために使用できます。

私の問題は、呼び出したい項目が XML 構造に深くネストされていることでした。しかし、解決策は非常に簡単です。開きたいアイテムに akey を追加します。PreferenceScreen

<PreferenceScreen
    android:key="pref_key"
    ....
    />
    <ListPreference android:key="abc"
        android:title="@string/abc"
        android:summary="@string/cde"
        android:persistent="true"/>

</PreferenceScreen>

そして、次のことができます:

// the preference screen your item is in must be known
PreferenceScreen screen = (PreferenceScreen) findPreference("pref_key");

// the position of your item inside the preference screen above
int pos = findPreference("abc").getOrder();

// simulate a click / call it!!
screen.onItemClick( null, null, pos, 0 ); 

そして、ダイアログがポップアップします!

設定を移動したり XML を変更したりすると、自動ダイアログが静かに中断され、気付かれない可能性があるため (テストされていない場合) 、 PreferenceScreenaが入っていると便利ですPreference(そのため、自分がどこにいるかを知る必要はありません)。Preference

このために、すべての設定を検索し、設定がオンになっていることを返す関数を作成したPreferenceScreenので、PreferenceScreen にキーを設定する必要はありません。

private PreferenceScreen findPreferenceScreenForPreference( String key, PreferenceScreen screen ) {
    if( screen == null ) {
        screen = getPreferenceScreen();
    }

    PreferenceScreen result = null;

    android.widget.Adapter ada = screen.getRootAdapter();
    for( int i = 0; i < ada.getCount(); i++ ) {
        String prefKey = ((Preference)ada.getItem(i)).getKey();
        if( prefKey != null && prefKey.equals( key ) ) {
            return screen;
        }
        if( ada.getItem(i).getClass().equals(android.preference.PreferenceScreen.class) ) {
            result = findPreferenceScreenForPreference( key, (PreferenceScreen) ada.getItem(i) );
            if( result != null ) {
                return result;
            }
        }
    }

    return null;
}

private void openPreference( String key ) {
    PreferenceScreen screen = findPreferenceScreenForPreference( key, null );
    if( screen != null ) {
        screen.onItemClick(null, null, findPreference(key).getOrder(), 0);
    }
}

// With this, you can call your `Preference` like this from code, you do
// not even have to give your PreferenceScreen a key!
openPreference( "abc" );
于 2011-02-01T23:08:50.447 に答える
23

ListPreference を拡張してダイアログを作成し、ListPreference の保護された showDialog メソッドを呼び出す独自のパブリック メソッドを含めることができます。何かのようなもの:

public void show()
{
    showDialog(null);
}

このようにして、あなたの回答のコメントで何人かの人々が指摘しているように、PreferenceGroups があるときに getOrder() が機能しないという問題に遭遇することはありません。

これは、保護された showDialog メソッドを持つ任意の設定タイプで実行できます。

于 2012-11-16T09:53:12.993 に答える
10

サポート ライブラリを使用すると、 PreferenceManager.showDialog(Preference)で簡単にダイアログを開くことができます。

あなたの PreferenceFragmentCompat で:

getPreferenceManager().showDialog(findPreference("pref_name"));

サポート設定パッケージには多くの問題があることに注意してください: 非マテリアル スタイル、開いているダイアログで回転するとクラッシュします。

于 2016-01-26T13:22:41.453 に答える
-1

待って、あなたもこのようなことをすることができます

Preference p=findPreference("settings_background_color");
p.setOnPreferenceClickListener(new OnPreferenceClickListener() {

    @Override
    public boolean onPreferenceClick(Preference preference) {

        int color=PreferenceManager.getDefaultSharedPreferences(ALifePatternsWallpaperSettings.this).getInt("settings_background_color", Color.BLACK);
        new ColorPickerDialog(ALifePatternsWallpaperSettings.this, ALifePatternsWallpaperSettings.this, "settings_background_color", color, Color.BLACK).show();
        return true;
    }
});
于 2011-08-31T13:13:07.620 に答える
-2

こんにちは友達はこのコードを試してみてください

getPreferenceManager().findPreference("YOUR PREF_KEY").setOnPreferenceClickListener(new OnPreferenceClickListener()
        {
            public boolean onPreferenceClick(Preference preference)
            {

                //your code here
                return true;
            }
        });
于 2012-11-19T12:34:52.550 に答える