web-dev-qa-db-ja.com

ラジオボタングループをpreference.xmlウィンドウで作成する方法

私はJava Android開発中です。初心者です。EclipseSDK 3.6.1バージョンを使用しています。2つのチェックボックスと1つの戻るボタンがある設定ウィンドウがあります。 。

    <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
             <PreferenceCategory
             Android:title="PIN requirement">                
            <CheckBoxPreference                        
                    Android:title="Use PIN" 
                    Android:defaultValue="true"                                              
                    Android:key="checkboxPref" /> 
           <CheckBoxPreference
                    Android:title="Don't use PIN"
                    Android:defaultValue="false"                        
                    Android:key="checkboxPref2" />

                    </PreferenceCategory>

<PreferenceCategory>
    <Preference
            Android:title="Back"                
            Android:key="customPref" />
    </PreferenceCategory>
</PreferenceScreen>

2つのCheckBoxをRadioButtonグループに変更する方法は?

18
Juronis

PINを使用して有効または無効にする必要があるだけの場合、この場合は1つのCheckBoxPreferenceで十分です(以下のコード例の最初のカテゴリを参照)。 RadioButtonは通常、設定のリスト(ListPreference)から何かを選択する必要がある場合に使用されます-たとえば(例のコード、2番目のカテゴリを参照)、色を選択します。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <PreferenceCategory
        Android:title="First Category">
        <CheckBoxPreference
            Android:title="Using PIN"
            Android:defaultValue="false"
            Android:key="checkboxPref" 
            Android:summaryOn="Disable PIN" 
            Android:summaryOff="Enable PIN"/>
    </PreferenceCategory>

    <PreferenceCategory
        Android:title="Second Category">
        <ListPreference
            Android:title="Pick your favourite color"
            Android:key="listPref"
            Android:defaultValue="4"
            Android:entries="@array/listArray"
            Android:entryValues="@array/listValues" />
    </PreferenceCategory>
</PreferenceScreen>

この例のソースコードは次のようになります。

public class PreferencesHelpExample extends PreferenceActivity implements OnSharedPreferenceChangeListener {

    public static final String KEY_LIST_PREFERENCE = "listPref";

    private ListPreference mListPreference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.preferences);

        // Get a reference to the preferences
        mListPreference = (ListPreference)getPreferenceScreen().findPreference(KEY_LIST_PREFERENCE);

    }

    @Override
    protected void onResume() {
        super.onResume();

        // Setup the initial values
        mListPreference.setSummary("Current value is " + mListPreference.getEntry().toString());

        // Set up a listener whenever a key changes            
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();

        // Unregister the listener whenever a key changes            
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);    
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // Set new summary, when a preference value changes
        if (key.equals(KEY_LIST_PREFERENCE)) {
            mListPreference.setSummary("Current value is " + mListPreference.getEntry().toString()); 
        }
    }
}

ListPreferenceの場合は、 "values"フォルダにあるarray.xmlファイルも必要です。

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string-array name="listArray">
        <item>red</item>
        <item>orange</item>
        <item>yellow</item>
        <item>green</item>
        <item>blue</item>
        <item>Violet</item>
    </string-array>

    <string-array name="listValues">
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
        <item>5</item>
        <item>6</item>
    </string-array>

</resources>

PreferenceActivityを使用した優れた例もいくつか参照してください-それらは私を大きく助けました:

Android設定;
リストの代わりにラジオボタンのグループを作成する方法;
Android環境設定の現在の値を表示するには?

34
Kate

いくつかの状況では、プリファレンスをラジオボタンとして動作させることは素晴らしい機能です。たとえば、各オプションの下に要約テキストを含める簡単な方法です。

チェックボックスのグループをラジオボタンのグループのように動作させるのは非常に簡単です。これを設定で行うには、グループ内のすべてのチェックボックスを同じOnPreferenceChangeListenerに登録し、このリスナーでfindPreference()を使用して他のチェックボックスを検索し、setChecked(false);を呼び出します。

public boolean onPreferenceChange(Preference preference, Object newValue) {
    String key = preference.getKey();
    if (key.equals("checkboxPref")) {
        //Reset other items
        CheckBoxPreference p = (CheckBoxPreference)findPreference("checkboxPref2");
        p.setChecked(false);
    }
    else if (key.equals("checkboxPref2")) {
        //Reset other items
        CheckBoxPreference p = (CheckBoxPreference)findPreference("checkboxPref");
        p.setChecked(false);
    }

    //Force the current focused checkbox to always stay checked when pressed
    //i.e confirms value when newValue is checked (true) and discards newValue
    //when newValue is unchecked (false)
    return (Boolean)newValue;
}

唯一の欠点は、チェックボックスがラジオボタンのように見えないことです...

11
Hamiora

それがあなたが望むものであれば、これはかなり簡単だと思います:

  1. 次のように、preferenses xmlにチェックボックスを追加します。

     <CheckBoxPreference
        Android:key="prefkey_cbp_1"
        Android:summary="@string/prefkey_cbp_1"
        Android:title="@string/prefkey_cbp_1"
        Android:defaultValue="false" />
    
    <CheckBoxPreference
        Android:key="prefkey_cbp_2"
        Android:summary="@string/prefkey_cbp_2"
        Android:title="@string/prefkey_cbp_2"
        Android:defaultValue="false" />
    
    //etc...
    
  2. 設定クラスonCreateで、CheckBoxPreference配列またはリストなど、好きなものを作成します。

    ArrayList<CheckBoxPreference> cbp_list = new ArrayList<CheckBoxPreference>();
    cbp_list.add((CheckBoxPreference) getPreferenceManager()
            .findPreference(PreferencesProtocol.prefkey_cbp_1));
    cbp_list.add((CheckBoxPreference) getPreferenceManager()
            .findPreference(PreferencesProtocol.prefkey_cbp_2));
    
  3. 設定クラスにOnPreferenceClickListenerを実装させ、OnPreferenceClickListenerを次のようなチェックボックスに設定します。

    for (CheckBoxPreference cbp : cbp_list) {
    cbp.setOnPreferenceClickListener(this);
    }
    
  4. 次に、onPreferenceClickをオーバーライドして、クリックを処理します。たとえば、チェックボックスをラジオボタンのように(同じラジオグループ内で)実行したい場合、つまり、一度に1つのチェックボックスのみをチェックする場合は、次のようにします。

    @Override
    public boolean onPreferenceClick(Preference arg0) {
    
    for (CheckBoxPreference cbp : cbp_list) {
    
        if (!cbp.getKey().equals(arg0.getKey()) && cbp.isChecked()) {
            cbp.setChecked(false);
        }
    
    }
    
    return false;
    }
    
3
user3154700

これを試して:

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, @NonNull Preference preference) {
        CheckBoxPreference cb1 = null;
        CheckBoxPreference cb2 = null;
        ListAdapter adapter = preferenceScreen.getRootAdapter();
        for(int i = 0; i < preferenceScreen.getRootAdapter().getCount(); i++)
        {
            //attention to type and key
            Preference pref = (Preference) adapter.getItem(i);
            if (pref == null || pref.getKey() == null)
                continue;
            if (pref.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_akt_position)))
                cb1 = (CheckBoxPreference) pref;
            if (pref.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_last_location)))
                cb2 = (CheckBoxPreference) pref;
            if (cb1 != null && cb2 != null)
                break;
        }
        //be safe
        if (cb1 == null || cb2 == null)
            return super.onPreferenceTreeClick(preferenceScreen, preference);

        if (preference.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_akt_position))) {
            CheckBoxPreference cb = (CheckBoxPreference) preference;
            cb2.setChecked(!cb.isChecked());
        }
        if (preference.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_last_location))) {
            CheckBoxPreference cb = (CheckBoxPreference) preference;
            cb1.setChecked(!cb.isChecked());
        }
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }
0
tom nobleman