【问题标题】:setOnClickListener on imageview needs to click two times in order to workimageview 上的 setOnClickListener 需要单击两次才能工作
【发布时间】:2017-07-13 08:04:30
【问题描述】:

我的活动中有ImageView,具有以下属性在 Imageview 上第二次起作用了

                  <ImageView
                        android:clickable="true"
                        android:focusable="false"
                        android:id="@+id/switchIcon"
                        android:layout_width="50dp"
                        android:layout_height="45dp"
                        android:layout_alignParentRight="true"
                        android:layout_below="@+id/title"
                        android:layout_weight="0.1"
                        android:scaleType="fitXY"
                        android:src="@drawable/ic_play_circle_filled_black_24dp" />

我的活动类文件中有以下代码:

ImageView switchIcon;
switchIcon = (ImageView) findViewById(R.id.switchIcon);


 switchIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public boolean onClick(View v) {

                    if (switchStatus.equals("video")) {
                        switchStatus = "image";
                        LayoutImage.setVisibility(View.VISIBLE);
                        LayoutVideo.setVisibility(View.GONE);
                        mPlayer.pause();
                        Glide.with(getApplicationContext()).load(R.drawable.ic_play_circle_filled_black_24dp).into(switchIcon);
                    } else if (switchStatus.equals("image")) {
                        if (requestData.get("video_link").equals("")) {
                            Toast.makeText(getApplicationContext(), "No Video Found for this Recipe", Toast.LENGTH_LONG).show();
                        } else {
                            switchStatus = "video";
                            LayoutImage.setVisibility(View.GONE);
                            LayoutVideo.setVisibility(View.VISIBLE);
                            mPlayer.play();
                            Glide.with(getApplicationContext()).load(R.drawable.ic_photo_size_select_actual_black_24dp).into(switchIcon);
                        }
                    } else {
                        switchStatus = "image";
                        LayoutImage.setVisibility(View.VISIBLE);
                        LayoutVideo.setVisibility(View.GONE);
                        mPlayer.pause();
                        Glide.with(getApplicationContext()).load(R.drawable.ic_play_circle_filled_black_24dp).into(switchIcon);
                    }
            }
        });

我还尝试添加OnTouchListener(),因为OnClickListener() 无法使用此功能,但OnTouchListener() 也无法使用 ImageView 它还需要单击两次才能获得 onclick 事件

 switchIcon.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_UP){
                    if (switchStatus.equals("video")) {
                        switchStatus = "image";
                        LayoutImage.setVisibility(View.VISIBLE);
                        LayoutVideo.setVisibility(View.GONE);
                        mPlayer.pause();
                        Glide.with(getApplicationContext()).load(R.drawable.ic_play_circle_filled_black_24dp).into(switchIcon);
                    } else if (switchStatus.equals("image")) {
                        if (requestData.get("video_link").equals("")) {
                            Toast.makeText(getApplicationContext(), "No Video Found for this Recipe", Toast.LENGTH_LONG).show();
                        } else {
                            switchStatus = "video";
                            LayoutImage.setVisibility(View.GONE);
                            LayoutVideo.setVisibility(View.VISIBLE);
                            mPlayer.play();
                            Glide.with(getApplicationContext()).load(R.drawable.ic_photo_size_select_actual_black_24dp).into(switchIcon);
                        }
                    } else {
                        switchStatus = "image";
                        LayoutImage.setVisibility(View.VISIBLE);
                        LayoutVideo.setVisibility(View.GONE);
                        mPlayer.pause();
                        Glide.with(getApplicationContext()).load(R.drawable.ic_play_circle_filled_black_24dp).into(switchIcon);
                    }

                    return true;
                }
                return false;
            }
        });

我也尝试将ImageView 更改为ImageButton,但这也无济于事,请告诉我我可以采取什么措施来解决这个问题。

【问题讨论】:

  • switchStatus的默认值是什么
  • switchStatus="" 的默认值为空白
  • android:focusable="false",为什么是这一行?
  • 我刚刚添加了该行以检查焦点是否有问题,因为第一次点击它获得焦点,第二次点击 Onclick 事件发生

标签: android onclick imageview listener


【解决方案1】:

我认为问题在于您的条件,每次点击都会调用 click,请尝试以下代码(点击时显示 toast):

 switchIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public boolean onClick(View v) {

                    if (switchStatus.equals("video")) {
                            Toast.makeText(getApplicationContext(), "switchStatus changed to video", Toast.LENGTH_LONG).show();

                        switchStatus = "image";
                        LayoutImage.setVisibility(View.VISIBLE);
                        LayoutVideo.setVisibility(View.GONE);
                        mPlayer.pause();
                        Glide.with(getApplicationContext()).load(R.drawable.ic_play_circle_filled_black_24dp).into(switchIcon);
                    } else if (switchStatus.equals("image")) {

                            Toast.makeText(getApplicationContext(), "switchStatus image has clicked", Toast.LENGTH_LONG).show();

                        if (requestData.get("video_link").equals("")) {
                            Toast.makeText(getApplicationContext(), "No Video Found for this Recipe", Toast.LENGTH_LONG).show();
                        } else {
                            switchStatus = "video";
                            LayoutImage.setVisibility(View.GONE);
                            LayoutVideo.setVisibility(View.VISIBLE);
                            mPlayer.play();
                            Glide.with(getApplicationContext()).load(R.drawable.ic_photo_size_select_actual_black_24dp).into(switchIcon);
                        }
                    } else {

                            Toast.makeText(getApplicationContext(), "switchStatus was blank, changed to image.", Toast.LENGTH_LONG).show();

                        switchStatus = "image";
                        LayoutImage.setVisibility(View.VISIBLE);
                        LayoutVideo.setVisibility(View.GONE);
                        mPlayer.pause();
                        Glide.with(getApplicationContext()).load(R.drawable.ic_play_circle_filled_black_24dp).into(switchIcon);
                    }
            }
        });

【讨论】:

  • 是的,我的情况有问题,我将 switchStatus 默认值设置为图像,它开始正常工作
【解决方案2】:

我把这个答案放在这里,以防有人遇到同样的问题并且与我的原因相同。 我的原因是我的布局中的另一个视图在触摸事件后保留焦点,因为我在实现其触摸监听器时忘记将返回值从 false 更改为 true。结果是在调用图像视图上的 onclick 事件之前,我必须在触摸另一个视图后单击我的图像视图两次才能将焦点返回到布局。 因此,通常确保布局中的其他视图可能在其上的触摸事件之后保持焦点,在这种情况下,其 onTouch 方法的实现应该返回 true 而不是默认的 false 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-15
    • 2019-05-30
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    相关资源
    最近更新 更多