Событие щелчка FrameLayout не срабатывает

Я использовал Framelayour для события клика, и до 2 дней он работал нормально, но не знаю, что случилось, теперь он не работает.
Пожалуйста, помогите мне.
Мой код выглядит следующим образом: Дизайн:

<FrameLayout
        android:id="@+id/flWebpre"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >

        <WebView
            android:id="@+id/wvWebsite"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

        <ProgressBar
            android:id="@+id/pbWebsite"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:layout_gravity="center_horizontal" />
    </FrameLayout>

Код:

FrameLayout flWebPre = (FrameLayout) findViewById(R.id.flWebpre);
    flWebPre.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (isExpanded) {
                isExpanded = false;

                new CollapseAnimation(slidingPanel, panelWidth,
                        TranslateAnimation.RELATIVE_TO_SELF, 0.70f,
                        TranslateAnimation.RELATIVE_TO_SELF, 0.0f, 0, 0.0f,
                        0, 0.0f);
            }
        }
    });

person Jeeten Parmar    schedule 07.06.2013    source источник
comment
Я знаю, что вы уже что-то сделали, но вы забыли добавить clickable в качестве параметра в свой FrameLayout.   -  person Tsunaze    schedule 10.06.2014


Ответы (1)


Одним из простых способов является перехват всех событий касания. По умолчанию ViewGroup#onInterceptTouchEvent возвращает false.

Вы можете создать индивидуальный макет:

public class ClickableFrameLayout extends FrameLayout {
    private OnClickListener mOnClickListener;

    @Override
    public void setOnClickListener(OnClickListener l) {
        super.setOnClickListener(l);
        mOnClickListener = l;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return mOnClickListener != null;
    }


    // Standard constructors — just pass everything
    public ClickableFrameLayout(final Context context) {
        super(context);
    }

    public ClickableFrameLayout(final Context context, final AttributeSet attrs) {
        super(context, attrs);
    }

    public ClickableFrameLayout(final Context context, final AttributeSet attrs, final int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public ClickableFrameLayout(final Context context, final AttributeSet attrs, final int defStyleAttr, final int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }
}
person jpmcosta    schedule 08.10.2014
comment
да, это работает, но вы забыли второй конструктор с AtributeSet... - person StefMa; 30.12.2014
comment
Вау, какое идеальное решение..! - person Wooseong Kim; 16.04.2015