web-dev-qa-db-ja.com

Android番号ピッカー付きのPreferenceActivityダイアログ

多くのカスタマイズされたソリューションとこの質問への回答を見てきました。私は非常にシンプルなものが必要で、設定アクティビティがあります。必要なのは、オプションの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>
24
Dim

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;
    }
}
55
Rob Meeuwisse

DialogPreferenceの実装は解決策です:

2
smarroufin

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");
        }
    }
...
}
0
steve