RelativeLayout中的顶视图忽略了点击次数

时间:2014-05-31 20:10:58

标签: android listview focus relativelayout

我在ListView内有一个RelativeLayout,而EditText的小型LinearLayouot应该悬停在列表上方。但是,当我点击EditText时,它会在下面的ListView上注册一次点击。这似乎是一个焦点问题。

这是代码:

  <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:orientation="vertical" >

            <LinearLayout
                android:id="@+id/llSearchPlaces"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_alignParentBottom="true"
                android:background="#dedede"
                android:clickable="true"
                android:focusable="true"
                android:focusableInTouchMode="true" >

                <EditText
                    android:id="@+id/etSearchPlaces"
                    android:layout_width="300dp"
                    android:layout_height="match_parent"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="2dp"
                    android:hint="Search for Places"
                    android:inputType="textCapWords" />
            </LinearLayout>


            <ListView
                android:id="@id/android:list"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:listSelector="@drawable/nav_selector" >
            </ListView>

        </RelativeLayout>

它希望焦点在id llSearchPlaces上。但是我设置的两个焦点属性不起作用。

3 个答案:

答案 0 :(得分:1)

尝试重新排序XML布局中的视图。忽略其他视图/视图组:

<RelativeLayout ...>
    <ListView .../>
    <EditText .../>
</RelativeLayout>

原因是ViewGroups倾向于按照描述的顺序绘制他们的孩子,并以相反的顺序向下传递触摸事件,因此在顶部绘制的视图有机会首先对触摸进行操作。如果您按照我的描述在XML中订购它们,EditText会稍后(在ListView之上)绘制,并且会在ListView之前接收触摸事件。

答案 1 :(得分:0)

试试这个:

首先:为listview创建布局xml,例如listview.xml

 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

     <ListView
            android:id="@id/android:list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:listSelector="@drawable/nav_selector"
            android:paddingBottom="50dp" >
     </ListView>

</LinearLayout>

第二步:为编辑文本创建布局xml,例如edittext.xml

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical" >

     <EditText
                android:id="@+id/etSearchPlaces"
                android:layout_width="300dp"
                android:layout_height="match_parent"
                android:layout_marginLeft="10dp"
                android:layout_marginTop="2dp"
                android:hint="Search for Places"
                android:inputType="textCapWords" />

       <requestFocus />

 </LinearLayout>

第三:在布局中合并这两个布局,例如mainlayout.xml

 <merge xmlns:android="http://schemas.android.com/apk/res/android" >

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <include 
        android:layout_alignParentTop="true"
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        layout="@layout/listview"/>

    <include 
        android:layout_alignTop="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        layout="@layout/edittext"/>

</RelativeLayout>

注意:将id和其他属性替换为你的......

答案 2 :(得分:0)

第二眼看,我不明白为什么你需要一个RelativeLayout。您实现的效果比EditTextListView。实际上,ListViewEditText重叠,您正在解决此问题,方法是让底部的ListView填充等于EditText容器的高度。< / p>

更好的选择是使用垂直LinearLayout在其下方包含ListViewEditText容器。这里ListView将占用EditText容器未使用的所有可用空间。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        ... />

    <LinearLayout
        android:id="@+id/llSearchPlaces"
        android:layout_width="match_parent"
        android:layout_height="..."
        android:orientation="horizontal" 
        ... >
    </LinearLayout>

</LinearLayout>