Можно ли сделать горизонтальный NumberPicker? - PullRequest
15 голосов
/ 23 июля 2011

Виджет NumberPicker от Android является вертикальным, с кнопками увеличения и уменьшения выше и ниже отображаемого числа.

Возможно ли сделать его горизонтальным?С кнопками слева и справа от номера?

Ответы [ 5 ]

11 голосов
/ 23 июля 2011

Вы не можете изменить NumberPicker AFAIK, но написание собственного должно быть довольно простым.

3 голосов
/ 09 мая 2019

Я искал похожее решение и создал реализацию на основе скриншота в этот вопрос .Имейте в виду, что это довольно простой и позволит учесть целые числа и установить минимальное и максимальное значение.(Любые дополнительные функции, которые вам нужно будет добавить самостоятельно.)

Вот как это будет выглядеть:

horizontal number picker screenshot

Вам нужен файл макета и файл класса для пользовательского компонента, а затем вы можете использовать его в других файлах макета (и класса).

Файл макета : numberpicker_horizont.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <Button
        android:id="@+id/btn_less"
        android:layout_width="0sp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="-" />

    <EditText
        android:id="@+id/et_number"
        android:layout_width="0sp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:textAlignment="center"
        android:inputType="number"
        android:text="0" />

    <Button
        android:id="@+id/btn_more"
        android:layout_width="0sp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="+" />
</LinearLayout>

Файл класса : HorizontalNumberPicker.java

public class HorizontalNumberPicker extends LinearLayout {
    private EditText et_number;
    private int min, max;

    public HorizontalNumberPicker(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        inflate(context, R.layout.numberpicker_horizontal, this);

        et_number = findViewById(R.id.et_number);

        final Button btn_less = findViewById(R.id.btn_less);
        btn_less.setOnClickListener(new AddHandler(-1));

        final Button btn_more = findViewById(R.id.btn_more);
        btn_more.setOnClickListener(new AddHandler(1));
    }

    /***
     * HANDLERS
     **/

    private class AddHandler implements OnClickListener {
        final int diff;

        public AddHandler(int diff) {
            this.diff = diff;
        }

        @Override
        public void onClick(View v) {
            int newValue = getValue() + diff;
            if (newValue < min) {
                newValue = min;
            } else if (newValue > max) {
                newValue = max;
            }
            et_number.setText(String.valueOf(newValue));
        }
    }

    /***
     * GETTERS & SETTERS
     */

    public int getValue() {
        if (et_number != null) {
            try {
                final String value = et_number.getText().toString();
                return Integer.parseInt(value);
            } catch (NumberFormatException ex) {
                Log.e("HorizontalNumberPicker", ex.toString());
            }
        }
        return 0;
    }

    public void setValue(final int value) {
        if (et_number != null) {
            et_number.setText(String.valueOf(value));
        }
    }

    public int getMin() {
        return min;
    }

    public void setMin(int min) {
        this.min = min;
    }

    public int getMax() {
        return max;
    }

    public void setMax(int max) {
        this.max = max;
    }
}

Затем включитеэто в других файлах макета следующим образом (заменив com.yourpackage на собственное имя пакета):

<com.yourpackage.HorizontalNumberPicker
    android:id="@+id/np_channel_nr"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

Затем вы можете использовать компонент, как любой другой компонент, и использоватьметод getValue () для получения текущего установленного значения:

// get a reference to the component
final HorizontalNumberPicker np_channel_nr = dialogView.findViewById(R.id.np_channel_nr);

// use value in your code
final int nr = np_channel_nr.getValue();
2 голосов
/ 23 июля 2011

Неа. На самом деле, вы пока не можете даже использовать его, даже если он отображается в конструкторе графических макетов. Это все еще защищено.

Этот вопрос имеет некоторую связанную информацию: Диалоговое окно выбора номера Android

1 голос
/ 08 июня 2016

Я не смог найти надежного решения, поэтому в конце концов сделал свое, но мне нужно было, чтобы оно выглядело как круглая шестеренка, поэтому оно адаптировано для этого варианта использования.

Вы можете получить идею из источника, хотя .. Вот оно:

https://github.com/milosmns/actual-number-picker

0 голосов
/ 29 сентября 2017

android: вращение = "от 90" до 90 градусов, или, как вам нравится, значение может быть отрицательным, оно будет вращать представление, но.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...