注意:如果您因为遇到类似问题而来到这里,请确保您阅读并尝试提供的所有答案。似乎在某些情况下,一种可能比另一种更好。所以也做你自己的测试!
前言
我得到了这样的listview的行布局(这是我的真实布局的精简版,所以不要评论包裹在LinearLayout中的单个元素等内容 - 它只是为了说明问题 - 最终版本在那里有更多元素):
XML 文件在下面供参考,但我简要描述了我想要实现的目标:
- 蓝色框(图标)和“这里通常是长文本”TextView 是行“真实”内容(
item_main_container
)。它可以是任何东西——它应该是无关紧要的。此图层内容不可点击。事实上(但我刚刚意识到)我应该从下一层显示“蓝色盒子”一半被红色覆盖,一半被绿色盒子覆盖。 - 红色和绿色框是我将行的 OnCliclListeners 绑定到(包裹在
item_click_area_container
)的视图 - 我只希望用户能够点击该行,不管item_main_container
它的内容是什么(所以这些红色/绿色在应用程序中是透明的) . 注意:这些在图像上设置为透明,因此您可以item_main_content
通过它看到,但这仅用于演示目的。另请注意,红色和绿色代表单独的操作,我需要能够在item_click_area_container
图层上有更多元素才能根据用户点击的位置处理更多操作。 - 黄色区域 (
button_bar_container
) 包含用户可能想要点击的按钮。
所以基本上item_click_area_container
覆盖item_main_container
,但不是button_bar_container
,item_click_area_container
否则用户将无法点击其任何按钮。从长远来看,它将是:
布局大纲如下所示:
问题
尽管我很努力,但我无法item_click_area_container
正确地拉伸以覆盖整体。 item_main_container
由于"usually long text here"
文本可以是任意长度,我不知道item_main_container
. 在下面的 XML 中有android:layout_height="100dp
- 这适用于我看到所有行元素,但是对于较长的文本item_click_area_container
高度太小。但是,如果我将其替换为,android:layout_height="fill_parent"
则整体item_click_area_container
将不可见,这违背了目的。
问题
- 为什么这不能按预期工作和/或如何解决?
- 有没有比使用像我这样的方法
item_click_area_container
(但没有基于 OnTouchListener 的解决方案)更好的方法来获得内容独立的点击区域?
布局 XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_container"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/item_main_container"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/item_avatar"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="#0000ff"
android:src="@drawable/icon_help"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView android:id="@+id/item_body"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Usually long text here..."
android:textColor="#ffffff"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/item_click_area_container"
android:layout_width="fill_parent"
android:layout_height="100dp">
<LinearLayout
android:id="@+id/green_click"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="#7700ff00">
</LinearLayout>
<LinearLayout
android:id="@+id/red_click"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="2"
android:background="#77ff0000">
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:id="@+id/button_bar_container"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_marginTop="3dp"
android:background="#ffff00">
</LinearLayout>
</LinearLayout>
编辑#1
我想我可以使用OnTouchListener
, 并onTouch()
检查event.getAction()
是否MotionEvent.ACTION_DOWN
读取了事件的 X/Y 并检查视图的边界。这可能会奏效,但如果可能的话,我更愿意单独使用 OnClickListener。更不用说它有助于理解当前的罪魁祸首是什么,尤其是在 ADT 中正确呈现布局