多くのカスタマイズされたソリューションとこの質問への回答を見てきました。私は非常にシンプルなものが必要で、設定アクティビティがあります。必要なのは、オプションの1つが番号ピッカーでダイアログを開き、結果を保存することだけです。これを達成する方法を段階的に私に案内していただけませんか?
public class SettingsActivity extends PreferenceActivity
{
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(Android.R.id.content, new MyPreferenceFragment()).commit();
//requestWindowFeature(Window.FEATURE_NO_TITLE);
}
public static class MyPreferenceFragment extends PreferenceFragment
{
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
}
}
}
XML:
<SwitchPreference
Android:key="cross"
Android:summaryOff="Cross is invisible"
Android:summaryOn="Cross is visible"
Android:switchTextOff="OFF"
Android:switchTextOn="ON"
Android:title="Cross"
Android:defaultValue="true"/>
<SwitchPreference
Android:key="autoP"
Android:summaryOff="App will go to sleep"
Android:summaryOn="App will not go to sleep"
Android:switchTextOff="OFF"
Android:switchTextOn="ON"
Android:title="Always On"
Android:defaultValue="true"/>
<SwitchPreference
Android:key="tempD"
Android:summaryOff="Temprature not displayed"
Android:summaryOn="Temprature displayed"
Android:switchTextOff="OFF"
Android:switchTextOn="ON"
Android:title="Tempature Display"
Android:defaultValue="true"/>
<ListPreference
Android:entries="@array/units"
Android:entryValues="@array/lunits"
Android:key="listUnits"
Android:summary="Units schosssing"
Android:title="Units" Android:defaultValue="C"/>
<!--Need to add button to open dialog-->
</PreferenceScreen>
番号ピッカーXML:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" >
<NumberPicker
Android:id="@+id/numberPicker1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentTop="true"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="64dp" />
<Button
Android:id="@+id/button2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/numberPicker1"
Android:layout_marginLeft="20dp"
Android:layout_marginTop="98dp"
Android:layout_toRightOf="@+id/numberPicker1"
Android:text="Cancel" />
<Button
Android:id="@+id/button1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignBaseline="@+id/button2"
Android:layout_alignBottom="@+id/button2"
Android:layout_marginRight="16dp"
Android:layout_toLeftOf="@+id/numberPicker1"
Android:text="Set" />
</RelativeLayout>
DialogPreference
をサブクラス化して、独自のNumberPickerPreference
を構築します。
以下を実装しました。完全に正常に動作しますが、完全な機能ではありません。たとえば、最小値と最大値はハードコードされた定数です。これらは、実際には設定xml宣言の属性である必要があります。これを機能させるには、カスタム属性を指定するattrs.xmlファイルを追加する必要があります。
ライブラリプロジェクトのカスタムxml属性をサポートするNumberPicker設定ウィジェットの完全な実装と、その使用方法を示すデモアプリについては、GitHubを参照してください: https://github.com/Alobar/AndroidPreferenceTest
名前を完全に修飾する必要がある場合を除いて、ウィジェットを他の設定ウィジェットとして使用します。
preferences.xml
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
<com.example.preference.NumberPickerPreference
Android:key="key_number"
Android:title="Give me a number"
Android:defaultValue="55" />
</PreferenceScreen>
NumberPickerPreference.Java
package com.example.preference;
import Android.content.Context;
import Android.content.res.TypedArray;
import Android.preference.DialogPreference;
import Android.util.AttributeSet;
import Android.view.Gravity;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.FrameLayout;
import Android.widget.NumberPicker;
/**
* A {@link Android.preference.Preference} that displays a number picker as a dialog.
*/
public class NumberPickerPreference extends DialogPreference {
// allowed range
public static final int MAX_VALUE = 100;
public static final int MIN_VALUE = 0;
// enable or disable the 'circular behavior'
public static final boolean WRAP_SELECTOR_WHEEL = true;
private NumberPicker picker;
private int value;
public NumberPickerPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NumberPickerPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected View onCreateDialogView() {
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER;
picker = new NumberPicker(getContext());
picker.setLayoutParams(layoutParams);
FrameLayout dialogView = new FrameLayout(getContext());
dialogView.addView(picker);
return dialogView;
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
picker.setMinValue(MIN_VALUE);
picker.setMaxValue(MAX_VALUE);
picker.setWrapSelectorWheel(WRAP_SELECTOR_WHEEL);
picker.setValue(getValue());
}
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
picker.clearFocus();
int newValue = picker.getValue();
if (callChangeListener(newValue)) {
setValue(newValue);
}
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return a.getInt(index, MIN_VALUE);
}
@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
setValue(restorePersistedValue ? getPersistedInt(MIN_VALUE) : (Integer) defaultValue);
}
public void setValue(int value) {
this.value = value;
persistInt(this.value);
}
public int getValue() {
return this.value;
}
}
DialogPreference
の実装は解決策です:
ListPreferenceに基づく簡単なソリューションは、値/エントリをその場で追加します。
root_preferences.xml:
<PreferenceScreen xmlns:app="http://schemas.Android.com/apk/res-auto"
...
<ListPreference
app:key="myNumber"
app:title="my title"
app:useSimpleSummaryProvider="true"/>
SettingsActivity.Java:
public class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
ListPreference e = findPreference("myNumber");
if (e != null) {
String[] vals = new String[100];
for (int i = 0; i < vals.length; i++)
vals[i] = String.valueOf(i + 1);
e.setEntries(vals);
e.setEntryValues(vals);
e.setDefaultValue("1");
}
}
...
}