我正在使用一个带有自定义样式的ratingbar作为指示器,但是我希望用户仍然能够单击ratingbar以显示一个带有可更改ratingbar的自定义对话框。
有没有什么办法不使用图像来完成这项工作?
举例说明:

最佳答案

对于那些有同样问题的人,我想出来了。

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

关键是,即使isIndicator为true,也可以使用setPressed为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());
    }
});

上面的代码同时使用onkeylister和setonratingbarchangelister。要启用关键事件,您需要设置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元素。要解决这个问题,只需使用onkeylister检测左右dpad操作,并使用searchfocus和requestfocus更改焦点。请记住,如果没有找到ui元素,searchfocus将返回null。
希望这能帮助其他遇到这个问题的人。:)

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

10-10 09:35