私は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グループに変更する方法は?
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環境設定の現在の値を表示するには?
いくつかの状況では、プリファレンスをラジオボタンとして動作させることは素晴らしい機能です。たとえば、各オプションの下に要約テキストを含める簡単な方法です。
チェックボックスのグループをラジオボタンのグループのように動作させるのは非常に簡単です。これを設定で行うには、グループ内のすべてのチェックボックスを同じ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;
}
唯一の欠点は、チェックボックスがラジオボタンのように見えないことです...
それがあなたが望むものであれば、これはかなり簡単だと思います:
次のように、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...
設定クラス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));
設定クラスにOnPreferenceClickListenerを実装させ、OnPreferenceClickListenerを次のようなチェックボックスに設定します。
for (CheckBoxPreference cbp : cbp_list) {
cbp.setOnPreferenceClickListener(this);
}
次に、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;
}
これを試して:
@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);
}