1

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

<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),但我不太清楚如何使用这些标志。

4

1 回答 1

4

为什么不在您的 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
        }
    });  
于 2013-08-19T21:55:59.463 回答