长按侦听器可停用视图

爱奥努特·内格鲁(Ionut Negru)

我有一些以编程方式激活和停用的视图(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" />

我在这里做错了什么?

此线程处理相同的问题Button.setClickable(false)无法正常工作

我通常使用该函数view.setEnabled(false);来执行类似的操作。

但在我链接到他们的线程中,也建议使用

view.setFocusableInTouchMode(false);

或者

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章