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 мс, тогда будет показан диалог.