忽略叠加视图中的触摸

时间:2013-08-19 21:44:22

标签: android

我有一个非常简单的布局 - 它有两个视图:列表视图和完全覆盖的“叠加”视图;下面是一个例子:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <ListView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/listView"/>

    <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

        <ImageView
                android:layout_width="360dp"
                android:layout_height="270dp"
                android:id="@+id/imageView"
                android:layout_centerInParent="true"
                android:background="#8888"/>

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="This is some text"
                android:id="@+id/button"
                android:layout_below="@+id/imageView"
                android:layout_centerHorizontal="true"/>
    </RelativeLayout> 
</RelativeLayout>

我使叠加视图比我的实际更简单,没有 想要触摸的视图(也就是说,没有按钮或可滚动区域) - 一些LinearLayout分散了)。我想做的是不仅忽略布局中的触摸,还忽略布局的所有子视图中的触摸。我想要接收的唯一视图是ListView。

我首先以简单的方式实现它 - 非常类似于上面 - 并且触摸永远不会通过底层ListView(当我拖动时它不会滚动)。

我真的没有第一个线索如何为Android做这个。另一个SO答案(https://stackoverflow.com/a/9462091/875486)指向使用一些标志(特别是FLAG_NOT_TOUCHABLE和FLAG_NOT_FOCUSABLE)但我无法弄清楚如何使用这些标志。

1 个答案:

答案 0 :(得分:3)

为什么不在xml中为您的RelativeLayout分配一个id,并为它提供一个OnTouchListener,以便在代码中不做任何事情。这将覆盖没有侦听器的基础视图。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/layout"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <ListView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/listView"/>

    <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

        <ImageView
                android:layout_width="360dp"
                android:layout_height="270dp"
                android:id="@+id/imageView"
                android:layout_centerInParent="true"
                android:background="#8888"/>

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="This is some text"
                android:id="@+id/button"
                android:layout_below="@+id/imageView"
                android:layout_centerHorizontal="true"/>
    </RelativeLayout> 
</RelativeLayout>

...

RelativeLayout mLayout = (RelativeLayout) findViewById(R.id.layout);
mLayout.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // Intercept touch events so they are not passed to underlying views.
            return true;
        }
    });

ListView mListView = (ListView) findViewById(R.id.listView);
mListView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            //Do stuff
        }
    });