Вопрос

I have some views(ImageView) that I activate & deactivate programmatically. I have implemented this method to activate/deactivate the state of the view:

/**
     * 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);
        }
    }

Everything works ok with this, but now I want to add an long click listener for the views when they are active. This is the method that I call in onCreate() to set the long click listeners:

/**
 * 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;
        }
    });
}

The problem that appears is that the items are clickable even if they are not activated(the first time only the selector appears), but the next time(activate and after that deactivate) the items are also clickable.

I also have an selector set as background for each 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" />

What I am doing wrong here ?

Это было полезно?

Решение

This thread handles the same problem Button.setClickable(false) is not working

I usually use the function view.setEnabled(false); for doing something like this.

but in the thread i linked to they also suggest using

view.setFocusableInTouchMode(false);

or

view.setClickable(false);
view.setFocusable(false);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top