Можно ли сделать горизонтальный NumberPicker?

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

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

Ответ 1

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

Ответ 2

Один RelativeLayout 2 Buttons один EditText/TextView с причудливым фоном между ними и там вы идете. Установка MIN и MAX, переопределяя onClickListener() s. Немного тестов. Что это.

Ответ 3

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

У этого вопроса есть некоторая связанная информация: Диалоговое окно выбора номера Android

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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();