我有一些视图(ImageView),我以编程方式激活和停用。我已经实现了这种方法来激活/停用视图的状态:
/**
* Change the state of the bottom PopUp menu of buttons.
*
* @param state
* The state in which to change the menu. <b>true</b> for active,
* <b>false</b>otherwise.
* @param includePaste
* If to include the paste button into the state change of the
* menu buttons.
*/
private void setPopUpBottomState(final boolean state,
final boolean includePaste) {
if (null != popup_download) {
popup_download
.setImageResource(state ? R.drawable.ic_bottom_menu_download
: R.drawable.ic_bottom_menu_download_inactive);
popup_download.setClickable(state);
popup_download.setEnabled(state);
}
if (null != popup_share) {
popup_share
.setImageResource(state ? R.drawable.ic_bottom_menu_share
: R.drawable.ic_bottom_menu_share_inactive);
popup_share.setClickable(state);
popup_share.setEnabled(state);
}
if (null != popup_copy) {
popup_copy.setImageResource(state ? R.drawable.ic_bottom_menu_copy
: R.drawable.ic_bottom_menu_copy_inactive);
popup_copy.setClickable(state);
popup_copy.setEnabled(state);
}
if (null != popup_cut) {
popup_cut.setImageResource(state ? R.drawable.ic_bottom_menu_cut
: R.drawable.ic_bottom_menu_cut_inactive);
popup_cut.setClickable(state);
popup_cut.setEnabled(state);
}
if (null != popup_rename) {
popup_rename
.setImageResource(state ? R.drawable.ic_bottom_menu_rename
: R.drawable.ic_bottom_menu_rename_inactive);
popup_rename.setClickable(state);
popup_rename.setEnabled(state);
}
if (null != popup_delete) {
popup_delete
.setImageResource(state ? R.drawable.ic_bottom_menu_trash
: R.drawable.ic_bottom_menu_trash_inactive);
popup_delete.setClickable(state);
popup_delete.setEnabled(state);
}
if (includePaste && null != popup_paste) {
popup_paste
.setImageResource(state ? R.drawable.ic_bottom_menu_paste
: R.drawable.ic_bottom_menu_paste_inactive);
popup_paste.setClickable(state);
popup_paste.setEnabled(state);
}
}
一切正常,但现在我想在视图处于活动状态时为视图添加一个长单击侦听器。这是我在 onCreate() 中调用的设置长点击侦听器的方法:
/**
* Set the long click listener for each ImageView on the bottom popup menu
* options. <br />
* Will be active only when the options are active.
*/
private void setPopUpBottomLongClickListener() {
// long click listener for hints
popup_download.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (popup_download.isClickable() && popup_download.isEnabled()) {
Toast.makeText(
FileManagerActivity.this,
getResources().getString(
R.string.bottom_menu_download),
Toast.LENGTH_LONG).show();
}
// The callback consumed the click
return true;
}
});
popup_share.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (popup_share.isClickable() && popup_share.isEnabled()) {
Toast.makeText(
FileManagerActivity.this,
getResources()
.getString(R.string.bottom_menu_share),
Toast.LENGTH_LONG).show();
}
// The callback consumed the click
return true;
}
});
popup_copy.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (popup_copy.isClickable() && popup_copy.isEnabled()) {
Toast.makeText(
FileManagerActivity.this,
getResources().getString(R.string.bottom_menu_copy),
Toast.LENGTH_LONG).show();
}
// The callback consumed the click
return true;
}
});
popup_cut.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (popup_cut.isClickable() && popup_cut.isEnabled()) {
Toast.makeText(FileManagerActivity.this,
getResources().getString(R.string.bottom_menu_cut),
Toast.LENGTH_LONG).show();
}
// The callback consumed the click
return true;
}
});
popup_rename.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (popup_rename.isClickable() && popup_rename.isEnabled()) {
Toast.makeText(
FileManagerActivity.this,
getResources().getString(
R.string.bottom_menu_rename),
Toast.LENGTH_LONG).show();
}
// The callback consumed the click
return true;
}
});
popup_delete.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (popup_delete.isClickable() && popup_delete.isEnabled()) {
Toast.makeText(
FileManagerActivity.this,
getResources().getString(
R.string.bottom_menu_delete),
Toast.LENGTH_LONG).show();
}
// The callback consumed the click
return true;
}
});
popup_paste.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (popup_paste.isClickable() && popup_download.isEnabled()) {
Toast.makeText(
FileManagerActivity.this,
getResources()
.getString(R.string.bottom_menu_paste),
Toast.LENGTH_LONG).show();
}
// The callback consumed the click
return true;
}
});
}
出现的问题是,即使项目未激活,它们也是可点击的(第一次只出现选择器),但下一次(激活并在停用之后)项目也是可点击的。
我还为每个图像视图设置了一个选择器作为背景:
<!-- Selector for bottom menu buttons -->
<item
android:state_selected="false"
android:state_pressed="false"
android:drawable="@android:color/transparent" />
<item android:state_pressed="true"
android:drawable="@color/ic_bottom_menu_selector" />
<item android:state_selected="true"
android:state_pressed="false"
android:drawable="@color/ic_bottom_menu_selector" />
我在这里做错了什么?
此线程处理相同的问题 Button.setClickable(false) 不起作用
我通常使用函数view.setEnabled(false);
来做这样的事情。
但是在我链接到的线程中,他们也建议使用
view.setFocusableInTouchMode(false);
或
view.setClickable(false);
view.setFocusable(false);