长按侦听器以取消激活视图

时间:2014-01-14 11:19:14

标签: android view selector clickable onlongclicklistener

我有一些我激活的视图(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;
        }
    });
}

出现的问题是,即使项目未被激活(第一次只显示选择器),这些项目也是可点击的,但下次(激活和停用后)项目也是可点击的。

我还有一个选择器设置为每个ImageView的背景:

<!-- 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" />

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

此线程处理同样的问题Button.setClickable(false) is not working

我通常使用函数view.setEnabled(false);来做这样的事情。

但在我链接的帖子中他们也建议使用

view.setFocusableInTouchMode(false);

view.setClickable(false);
view.setFocusable(false);