gpt4 book ai didi

当 isIndicator = True 时,Android RatingBar 作为按钮

转载 作者:搜寻专家 更新时间:2023-11-01 09:09:35 25 4
gpt4 key购买 nike

我正在使用具有自定义样式的评分栏作为指示器,但是我希望用户仍然能够单击评分栏以打开带有可以更改的评分栏的自定义对话框。

有没有办法不使用图像来做到这一点?

举例说明:

RatingBar Highlighed

最佳答案

对于那些在路上遇到同样问题的人,我想通了。

ratingBar = (RatingBar) findViewById(R.id.rbMyRating);
ratingBar.setIsIndicator(true);
ratingBar.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
myRatingDialog.show();
v.setPressed(false);
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
v.setPressed(true);
}
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
v.setPressed(false);
}
return true;
}
});

关键是您仍然可以将 setPressed 设置为 true,即使 isIndicator 为 true。这将只允许 RatingBar 突出显示但不允许更改。

您可以使用 OnTouchListener 管理 setPressed 状态。 ACTION_UP 和 ACTION_DOWN 控制小部件上的触摸事件,ACTION_CANCEL 处理小部件之外的任何事件。


上述代码的问题在于它不支持按键事件。为此,需要以下附加代码:

Float rating = 4f;
ratingBar.setFocusable(true);
ratingBar.setTag(rating);
ratingBar.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
v.setPressed(false);
myRatingDialog.show();
} else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
if (v.focusSearch(View.FOCUS_LEFT) != null) v.focusSearch(View.FOCUS_LEFT).requestFocus();
} else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
if (v.focusSearch(View.FOCUS_RIGHT) != null) v.focusSearch(View.FOCUS_RIGHT).requestFocus();
}
}
return false;
}
});
ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
ratingBar.setRating((Float) ratingBar.getTag());
}
});

以上代码同时使用了 OnKeyListener 和 setOnRatingBarChangeListener。要启用按键事件,您需要设置 setFocusable(true)。您还需要手动连接 KEYCODE_ENTER 和 KEYCODE_DPAD_CENTER 的按键事件。

setFocusable = true 的一个问题是您现在可以使用 KEYCODE_DPAD_LEFT 和 KEYCODE_DPAD_RIGHT 更改 RatingBar 评级。要解决此问题,您可以使用 onRatingBarChangeListener 来重置 RatingBar 的评级。您可以将评分存储在 RatingBar 的标签中。请记住,当您通过对话框更改评分时,您需要更改标签值。

由于使用了 onRatingBarChangeListener,您现在将面临最后一个问题。由于您正在自动更改评级,因此用户将无法使用 KEYCODE_DPAD_LEFT 和 KEYCODE_DPAD_RIGHT 关注其他 UI 元素。要解决此问题,您只需使用 OnKeyListener 来检测左右 DPad 操作并使用 searchFocus 和 requestFocus 更改焦点。请记住,如果未找到 UI 元素,searchFocus 将返回 null。

希望这对遇到此问题的其他人有所帮助。 :)

关于当 isIndicator = True 时,Android RatingBar 作为按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9247619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com