setOnClickListener on imageview 需要单击两次才能工作



我在活动中ImageView具有以下属性,我已经初始化了图像视图,并在ImageView上设置了OnClickListener,但是当我第一次单击图像视图时,onlick事件不起作用,但是当我第二次单击图像视图时,它可以工作

<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但它也没有帮助我,请告诉我我可以执行什么操作来解决此问题。

我认为问题出在您的条件上,并且每次单击都会调用单击,请尝试以下代码(单击时显示 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);
}
}
});

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

相关内容

最新更新