注意:如果您因为遇到类似问题而来到这里,请确保您阅读并尝试提供的所有答案。似乎在某些情况下,一个人可能比另一个人工作得更好。那么你自己的测试也是如此!
前言
我得到了listview的行布局(这是我的真实布局的精简版,所以不要评论包含在LinearLayout中的单个元素等等 - 它只是为了说明问题 - 最终版本有更多的元素):
XML文件在下面供参考,但我很快就会描述我想要实现的目标:
item_main_container
)。它可以是任何东西 - 它应该是无关紧要的。此图层内容不可点击。事实上(但我刚刚意识到)我应该将“蓝色方框”显示为红色半覆盖,下半层绿色方框覆盖一半。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中正确渲染布局
答案 0 :(得分:2)
您可以尝试更换
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">...</RelativeLayout>
带
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">...</FrameLayout>
然后将item_click_area_container
的参数设置为fill_parent
/ match_parent
,使其增长到覆盖与item_main_container
相同的区域。
如果您使用扩展LinearLayout
的类来处理红色和绿色区域所需的操作,那么您应该没问题。
答案 1 :(得分:2)
在这里你可以使用这种布局。简单的解决方案是使用以下4行将item_click_area_container
的4个边与item_main_container
的相应4边对齐:
android:layout_alignTop="@+id/item_main_container"
android:layout_alignBottom="@+id/item_main_container"
android:layout_alignLeft="@+id/item_main_container"
android:layout_alignRight="@+id/item_main_container"
这是包含wrap_content高度的布局。没有更多硬编码尺寸(:
<?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/ic_action_search" />
<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 hasdkfn ash jsjkgh sjhgjk hasjkh ash fjk hasdjkh fkjash jkdf hjkasdh fjkhasjkg hjkasjkd hfjkash gsdgh kgh sdfh fjksah djkfasd jkg jsdf asgjf sg sd agfgas fjhasg f asdgf gjhsdg sdjhsdg fasdfjhs agjhfg adf asdg jh dvhsdvjhas gdh fv gsfjivhdfvjksfgjkdhjhixcgzvjk gdshg dfg v gvgdfgvjkshvjksdgvsdvere..."
android:textColor="#000" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_alignTop="@+id/item_main_container"
android:layout_alignBottom="@+id/item_main_container"
android:layout_alignLeft="@+id/item_main_container"
android:layout_alignRight="@+id/item_main_container"
android:id="@+id/item_click_area_container"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<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>
答案 2 :(得分:0)
你可以这样做。
在layout.xml中的单个元素android:onClick
<LinearLayout
android:id="@+id/red_click"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="2"
android:background="#77ff0000">
android:onClick="redAreaClicked"
</LinearLayout>
在你的java文件中用以下代码写一个方法redAreaClicked()。
public void redAreaClicked(View v) {
RelativeLayout ParentRow = (RelativeLayout) v.getParent();
final int position = mList.getPositionForView(ParentRow);
// more code here..
}
这应该会给你列表中的位置。即行号。 但是要使其工作,您必须将所有子视图(彩色视图,在您的案例线性布局中)移动到单个父级中。使用相对布局我认为这是非常可行的。
否则你可以使用view.getId()和compare,以获得父视图。然后确定它在列表中的位置。
您可以对其他颜色区域执行相同操作。