单击整个布局上的侦听器

时间:2014-02-17 14:57:33

标签: android android-layout android-listview android-fragments android-listfragment

我有一个活动,里面有一个列表片段。如果我没有收到列表的元素,我想在整个布局上添加一个onclick监听器来重试请求。 活动布局 relative_browse

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/relative_browse"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</RelativeLayout>

然后在片段的onCreateView里面我膨胀 fragment_list_categoriers.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragment_list_categories"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@color/gray"
        android:dividerHeight="1dp"
        android:listSelector="@android:color/transparent" >
    </ListView>

</RelativeLayout>

我尝试在onActivityCreated内的空列表中添加onclick侦听器,但它不起作用:

@Override
public void onActivityCreated(Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);
    View view  = container.findViewById(R.id.fragment_list_categories);
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.w("DEBUG", "Click!");
        }
    });

}

特别是我没有“点击”日志,除了左边屏幕的一个小边框(就像fragment_list_categories覆盖除了一些像素之外的所有屏幕一样)。 什么是正确的方法?

编辑:这是我的 onCreateView 和onClick方法

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    this.inflater = inflater;

    View view = inflater.inflate(R.layout.fragment_list_categories,
            container, false);

    this.container = (ViewGroup) view;

    view.setOnClickListener(this);

    return view;
}


@Override
public void onClick(View v) {
    Log.d("DEBUG", "Click!");
}

2 个答案:

答案 0 :(得分:2)

突然出现的第一件事是ListView占据了所有空间。

由于您将其高度设置为match_parent,因此它将始终占据整个父级的空间。如果列表为空,则可能不是所需的行为。

ListViews有时会将点击传播到其父视图。当你点击它时,它可能只是死在那里而不是上升链。这可以解释为什么你可以获得“边界”的点击;它只是父视图的填充。

您可以考虑将ListView身高更改为wrap_content。这样,如果它是空的,它不会占用空间,你可以获得点击。

如果它实际上是空的,您可能还想尝试检测。如果您有几个条目没有占据父级的整个高度,那么如果用户单击“空”区域,预期的行为是什么?如果这也应该触发重试,那很好。如果没有,您需要根据它启用/禁用点击。

答案 1 :(得分:0)

你应该做的第一件事就是在onCreateView方法中将RelativeLayout实例化为

View view = inflater.inflate("Your fragment layout", null);
RelativeLayout rl = (RelativeLayout) view.findViewByID("your relative layout's ID");
rl.setOnClickListener(this);
return view;

然后实现OnClickListener并将onClick方法覆盖为

@override
public void onClick(View v){
   Log.d("Relative LAyout", String.valueOf(v));
}

如果您已完成上述操作,请发布您的onCreateView代码。