MaterialRangeBar: метод setOnRangeBarChangeListener

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

<com.appyvet.materialrangebar.RangeBar
        android:layout_marginEnd="4dp"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:id="@+id/radiusRangeBar"
        app:mrb_rangeBar="false"
        app:mrb_tickStart="1"
        app:mrb_tickEnd="5"
        app:mrb_tickInterval="1"
        app:mrb_pinRadius="8dp"
        app:mrb_pinMaxFont="8sp"
        app:mrb_barWeight="1dp"
        app:mrb_tickColor="@color/colorPrimary"
        app:mrb_connectingLineColor="@color/colorPrimaryDark"
        app:mrb_connectingLineWeight="3dp"
        app:mrb_pinColor="@color/switchColor"
        app:mrb_selectorColor="@color/switchColor"
        app:mrb_selectorSize="10dp"/>

Что я хочу сделать?

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

RangeBar radiusRangeBar;
AlertDialog alertDialog;
AlertDialog.Builder builder;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.activity_settings, container, false);
radiusRangeBar = (RangeBar) view.findViewById(R.id.radiusRangeBar);

radiusRangeBar.setOnRangeBarChangeListener(new RangeBar.OnRangeBarChangeListener() {
            @Override
            public void onRangeChangeListener(RangeBar rangeBar, int leftPinIndex, int rightPinIndex, String leftPinValue, String rightPinValue) {
                builder = new AlertDialog.Builder(getActivity());
                builder.setMessage("You are about to set the Nearby friends radius on " + rightPinValue + "km") ;
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        privateAccountsSwitch.setChecked(true);
                    }
                });
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        privateAccountsSwitch.setChecked(false);
                    }
                });
                alertDialog = builder.create();
                alertDialog.show();
            }
        });
}

Что случилось? - Поскольку это была единственная функция, упомянутая в документации, со страницы GitHub я пытался ее реализовать, но она не подходит для моей настройки, поскольку она отображает сообщение во время прокрутки, и я хочу, чтобы это происходило только тогда, когда я перестану прокручивать, Это выполнимо, или я должен попробовать другой метод, чтобы уведомить пользователя о его действии.

2 ответа

Решение

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

Это setOnRangeBarChangeListener сейчас.

 radiusRangeBar.setOnRangeBarChangeListener(new RangeBar.OnRangeBarChangeListener() {
        @Override
        public void onRangeChangeListener(RangeBar rangeBar, int leftPinIndex, int rightPinIndex, String leftPinValue, String rightPinValue) {
            rangeBarValue = rightPinValue;
            // first remove the previous action if it exists
            handler.removeCallbacks(showDialogRunnable);
            // schedule a new action to take place in 700ms
            handler.postDelayed(showDialogRunnable, 700);
        }
    });

Я создал строковую переменную, которая инициализируется перемещением селектора диапазона.

Тогда, если никаких действий не происходит на handler.postDelayed(showDialogRunnable, 700); сработает;

Вот код этой функции.

private final Handler handler = new Handler();
final Runnable showDialogRunnable = new Runnable() {
            @Override
            public void run() {
                builder = new AlertDialog.Builder(getActivity());
                builder.setMessage("You are about to set the Nearby friends radius on " + rangeBarValue + "km") ;
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        privateAccountsSwitch.setChecked(true);
                    }
                });
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        privateAccountsSwitch.setChecked(false);
                    }
                });
                alertDialog = builder.create();
                alertDialog.show();
                alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.alertDialogPositiveButton));
                alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.alertDialogNegativeButton));
            }
        };

Я проверил исходный код пользовательского виджета. Не существует какого-либо обратного вызова, который вас интересует, что означает, что у вас есть два варианта: либо изменить сами источники, либо применить обходной путь.

Я поделюсь решением для второго подхода. В целом, вам нужно выполнить какое-то действие только в том случае, если диапазон некоторое время не менялся (давайте зададим эту длительность равной 300 мс). Таким образом, вы можете использовать handler.postDelayed() механизм преодоления проблемы.

Объявить handler а также showDialogRunnable поля как таковые:


    private final Handler handler = new Handler();

    private final Runnable showDialogRunnable = new Runnable() {
        @Override
        public void run() {
            showDialog();
        }
    }

Затем выполните следующие изменения внутри слушателя:


    radiusRangeBar.setOnRangeBarChangeListener(new RangeBar.OnRangeBarChangeListener() {
        @Override
        public void onRangeChangeListener(RangeBar rangeBar, int leftPinIndex, int rightPinIndex, String leftPiString rightPinValue) {
            // first remove the previous action if it exists
            handler.removeCallbacks(showDialogRunnable);
            // schedule a new action to take place in 300ms
            handler.postDelayed(showDialogRunnable, 300);
        }
    });

Это обеспечит, что как только onRangeChangeListener() не запускается в окне 300 мс, тогда будет показан диалог.

Другие вопросы по тегам