Создать диалоговое окно NumberPicker в настройках

Я пытаюсь создать диалоговое окно NumberPicker на экране настроек. Я уже сделал следующее: https://stackoverflow.com/a/5533295/2442638

Однако для моего второго диалога мне нужен только один счетчик, поэтому я адаптировал код следующим образом:

import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.NumberPicker;

public class SnoozeTPP extends DialogPreference { 

    private int Minute = 0;
    private NumberPicker np= null;

    public static int getMinute(String time) {
        String[] pieces = time.split(":");

        return (Integer.parseInt(pieces[1]));
    }

    public SnoozeTPP(Context context, AttributeSet attrs) {
        super(context, attrs);

        setPositiveButtonText("Set"); 
        setNegativeButtonText("Cancel"); 
    }

    @Override
    protected View onCreateDialogView() {
        np = new NumberPicker(getContext());

        return (np);
    }

    @Override
    protected void onBindDialogView(View v) {
        super.onBindDialogView(v);

        np.setMaxValue(60);
        np.setValue(Minute);
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {                                                             
        super.onDialogClosed(positiveResult);

        if (positiveResult) {

            Minute = np.getValue();

            String time = 0 + ":" + String.valueOf(Minute);

            if (callChangeListener(time)) {
                persistString(time);
            }
        }
    }

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index) {
        return (a.getString(index));
    }

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        String time = null;

        if (restoreValue) {
            if (defaultValue == null) {
                time = getPersistedString("08:00");
            } else {
                time = getPersistedString(defaultValue.toString());
            }
        } else {
            time = defaultValue.toString();
        }

        Minute = getMinute(time);
    }

}

Ошибок нет, и диалог открывается корректно, но его расположение кажется "перепутанным" :-). Синяя линия растягивается по всему диалоговому окну, а не только по ширине чисел. введите здесь описание изображения

Вопрос - как правильно выставить раскладку? (Я уверен, что есть много других ошибок!)

Спасибо


person Community    schedule 07.07.2013    source источник
comment
может помочь вам gist.github.com/tomstrummer/959884   -  person Ryan S    schedule 07.07.2013
comment
@RSenApps Спасибо, я пробовал, но не смог заставить это работать :-(   -  person    schedule 07.07.2013


Ответы (4)


Я решил это с помощью средства выбора номера CyanogenMod. Java-файл:

https://github.com/CyanogenMod/android_packages_apps_Trebuchet/blob/cm-10.2/src/com/cyanogenmod/trebuchet/preference/NumberPickerPreference.java

XML-файл: https://github.com/CyanogenMod/android_packages_apps_Trebuchet/blob/cm-10.2/res/layout/number_picker_dialog.xml

Атрибуты: https://github.com/CyanogenMod/android_packages_apps_Trebuchet/blob/cm-10.2/res/values/attrs.xml#L158

person Community    schedule 22.02.2014
comment
это отличный ответ - person toobsco42; 22.02.2014
comment
Styleable находится здесь: github.com/CyanogenMod/android_packages_apps_Trebuchet/ блоб/ - person Gh61; 10.03.2014
comment
Этот класс ссылается на пакет com.android.internal. Нужно ли мне создавать original-android.jar, как описано здесь, чтобы использовать его, или я слишком усложняю это? - person Code Commander; 10.03.2014

Вот пример простого, но работающего NumberPickerPreference, сохраняющего целочисленное значение от 1 до 100:

скриншот приложения

NumberPickerPreference.java:

public class NumberPickerPreference extends DialogPreference {
    private NumberPicker mPicker;
    private Integer mNumber = 0;

    public NumberPickerPreference(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public NumberPickerPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setPositiveButtonText(android.R.string.ok);
        setNegativeButtonText(android.R.string.cancel);
    }

    @Override
    protected View onCreateDialogView() {
        mPicker = new NumberPicker(getContext());
        mPicker.setMinValue(1);
        mPicker.setMaxValue(100);
        mPicker.setValue(mNumber);
        return mPicker;
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        if (positiveResult) {
            // needed when user edits the text field and clicks OK
            mPicker.clearFocus();
            setValue(mPicker.getValue());
        }
    }   

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        setValue(restoreValue ? getPersistedInt(mNumber) : (Integer) defaultValue);
    }

    public void setValue(int value) {
        if (shouldPersist()) {
            persistInt(value);
        }

        if (value != mNumber) {
            mNumber = value;
            notifyChanged();
        }
    }

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index) {
        return a.getInt(index, 0);
    }
}
person Alexander Farber    schedule 24.05.2015

Это скорее обходной путь, чем решение, но я надеюсь, что это поможет. Добавление фиктивного textView решило проблему. У меня точно такая же проблема.

Мой xml-файл:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textDummyEmpty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/textDummyEmpty" />

    <NumberPicker 
        android:id="@+id/numberPicker1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" /> 

</LinearLayout>

а также

android:text="@string/textDummyEmpty" 

является пустой строкой. Может быть, также достаточно использовать только представление вместо textView.

person KelvinGradCelsius    schedule 31.07.2013
comment
Спасибо за Ваш ответ. В конце концов, я использовал другой метод для его создания — это был открытый исходный код. Я не могу попробовать то, что вы предложили в данный момент, но я постараюсь сделать это в ближайшее время :-) - person ; 08.08.2013
comment
@RiThBo, пожалуйста, поделитесь, как вы решили проблему, чтобы другие пользователи тоже могли это сделать. - person Dick Lucas; 03.02.2014
comment
@Richard Я использовал CyanogenMod. Он где-то на GitHub, я искал точный файл, но больше не могу его найти. Извиняюсь - person ; 04.02.2014
comment
эй, @RiThBo, как ты решил эту проблему с синими линиями, растянувшимися по всему диалоговому окну? - person toobsco42; 22.02.2014
comment
@toobsco42 toobsco42 Я не нашел ссылку на файл GitHub, но опубликовал ответ, содержащий большую часть кода. - person ; 22.02.2014
comment
@Richard Смотрите мой ответ, если у вас все еще есть проблемы. - person ; 22.02.2014
comment
@RiThBo, где вы установили этот XML-файл? в каком классе? - person toobsco42; 22.02.2014

верните LinearLayout в onCreateDialogView, а не в NumberPicker, как показано ниже:

@Override
protected View onCreateDialogView() {
    numberPicker = new NumberPicker(getContext());
    numberPicker.setMinValue(1);
    numberPicker.setMaxValue(12);
    numberPicker.setWrapSelectorWheel(false);
    numberPicker.setValue(lastValue);

    LinearLayout.LayoutParams pickerParams = new LinearLayout.LayoutParams
            (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    pickerParams.gravity = Gravity.CENTER;
    numberPicker.setLayoutParams(pickerParams);

    LinearLayout layout = new LinearLayout(getContext());
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
            (LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    layout.setOrientation(LinearLayout.VERTICAL);
    layout.setLayoutParams(params);

    layout.addView(numberPicker);
    return layout;

    //return numberPicker;
}
person Robert    schedule 19.12.2014