Row的内容独立可点击区域

时间:2012-10-28 12:58:14

标签: android android-layout listview

注意:如果您因为遇到类似问题而来到这里,请确保您阅读并尝试提供的所有答案。似乎在某些情况下,一个人可能比另一个人工作得更好。那么你自己的测试也是如此!

前言

我得到了listview的行布局(这是我的真实布局的精简版,所以不要评论包含在LinearLayout中的单个元素等等 - 它只是为了说明问题 - 最终版本有更多的元素):

enter image description here

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,否则用户将无法点按其任何按钮。从视角来看,它将是:

enter image description here

布局大纲如下所示:

enter image description here


问题

尽管付出了努力,但我无法正确地展示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都不可见,这会使目的失败。


问题

  1. 为什么这不能按预期工作和/或如何解决?
  2. 有没有更好的方法来使用内容独立的点击区域而不是像我的item_click_area_container这样的方法(但没有基于OnTouchListener的解决方案)?

  3. 布局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中正确渲染布局

3 个答案:

答案 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,以获得父视图。然后确定它在列表中的位置。

您可以对其他颜色区域执行相同操作。