触发事件时Android安卓对话框

时间:2014-11-16 13:27:40

标签: java android dialog

我的Java代码存在一些逻辑问题,提示对话框。所以基本上当我的ratingBar是onTouch时,我会得到星号和提示对话框:

ratingBar.setOnTouchListener(new OnTouchListener()
    { 
        public boolean onTouch(View view, MotionEvent event)
        { 
            float touchPositionX = event.getX();
            float width = ratingBar.getWidth();
            float starsf = (touchPositionX / width) * 5.0f;
            starRate = (int)starsf + 1;
            ratingBar.setRating(starRate);
            promptSubmitStar();
            return true; 
        } 
    });

 public void promptSubmitStar(){
    AlertDialog.Builder Dialog = new AlertDialog.Builder(getActivity());
    Dialog.setTitle("Confirm Rating");
    LayoutInflater li = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View dialogView = li.inflate(R.layout.option_submit_star, null);
    txtPromptStarRate = (TextView) dialogView.findViewById(R.id.txtPromptStarRate);
    txtPromptStarRate.setText("Confirm to submit " + starRate + " stars for this event?");
    Dialog.setView(dialogView);
    Dialog.setPositiveButton("Ok",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,
                        int whichButton) {          
                    dialog.dismiss();
                }
            });

    Dialog.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,
                        int whichButton) {
                    dialog.dismiss();
                }
            });
    Dialog.show();
}

但是使用这些代码,当用户选择星号时,对话框会提示两次。我想知道是哪一部分造成的。提前谢谢。

1 个答案:

答案 0 :(得分:0)

这是因为onTouch监听器被多次调用,即当你的手指落在屏幕上时(ACTION_DOWN)和你的手指向上移动(ACTION_UP)。

您希望在后者触发时显示对话框:

ratingBar.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            float touchPositionX = event.getX();
            float width = ratingBar.getWidth();
            float starsf = (touchPositionX / width) * 5.0f;
            starRate = (int) starsf + 1;
            ratingBar.setRating(starRate);
            promptSubmitStar();
        }
        return true;
    }
});

我不确定为什么你会使用触控听众。您可以像这样收听RatingBar更改:

ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
    @Override
    public void onRatingChanged(RatingBar bar, float rating, boolean user) {
        promptSubmitStar();
    }
});