我有一个非常简单的布局 - 它有两个视图:列表视图和完全覆盖的“叠加”视图;下面是一个例子:
<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)但我无法弄清楚如何使用这些标志。
答案 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
}
});