Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:在listfragment中的listview外部单击_Java_Android_Listview_Onclicklistener - Fatal编程技术网

Java Android:在listfragment中的listview外部单击

Java Android:在listfragment中的listview外部单击,java,android,listview,onclicklistener,Java,Android,Listview,Onclicklistener,我有一个listview,理论上它占据了版面的所有空间,但实际上它只占据了版面的一半,因为它只有5个元素,并且没有覆盖整个屏幕。我想知道我什么时候触摸listview外部。我尝试为包含列表的listfragment的布局创建clicklistener方法,但从未使用过,因为理论上listview占据了所有布局,因此没有找到单击。活动的布局大致相同。在这种情况下,只能在边缘上找到单击,因此我无法找到解决问题的方法 以下是片段布局: <LinearLayout xmlns:android="h

我有一个listview,理论上它占据了版面的所有空间,但实际上它只占据了版面的一半,因为它只有5个元素,并且没有覆盖整个屏幕。我想知道我什么时候触摸listview外部。我尝试为包含列表的listfragment的布局创建clicklistener方法,但从未使用过,因为理论上listview占据了所有布局,因此没有找到单击。活动的布局大致相同。在这种情况下,只能在边缘上找到单击,因此我无法找到解决问题的方法

以下是片段布局:

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

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@android:id/list" />

以下是活动布局:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.utente.actionbar.MainActivity">

<Button
    android:text="MULTI"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="26dp"
    android:id="@+id/button" />

<Button
    android:text="SINGOLO"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/button"
    android:layout_alignLeft="@+id/button"
    android:layout_alignStart="@+id/button"
    android:layout_marginBottom="25dp"
    android:id="@+id/button2" />

理论上,listview占据了所有布局

不是一个理论,这正是发生的事情;通过使用android:layout\u height=“match\u parent”视图将始终采用全屏高度


listView.setOnClickListener
如果您想查看是否单击了
listView
中的任何位置,则可以使用它,但是您通常希望
listView.setOnItemClickListener
查看您是否单击了任何单个项目,而不是整个列表

参考:

如果您真的想缩小
列表视图
,那么
android:layout\u height=“wrap\u content”
是一个选项,但我不确定如果没有内容实际加载到该视图中,该选项是否有效,因为内容包装是在充气时应用的,因为它没有适配器设置,所以无法完成


如果您需要从字面上“在ListView之外”检测侦听器,那么您需要在该片段的
rootView
上设置某种类型的单击/触摸侦听器

public View onCreateView(...) {
    rootView = inflater.inflate(...);

    listView = ...;
    listView.setOnTouchListner(...
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return false; // Says that click was not handled here. 
        }
    });

    rootView.setOnTouchListner(...
        // TODO: Check if click landed outside the ListView
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (v.getId() != android.R.id.listView) { // Not the list
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    // Up action more reliable than "down"

                    return true;
                }
            }
        }
    );
    return rootView;
}
理论上,listview占据了所有布局

不是一个理论,这正是发生的事情;通过使用android:layout\u height=“match\u parent”视图将始终采用全屏高度


listView.setOnClickListener
如果您想查看是否单击了
listView
中的任何位置,则可以使用它,但是您通常希望
listView.setOnItemClickListener
查看您是否单击了任何单个项目,而不是整个列表

参考:

如果您真的想缩小
列表视图
,那么
android:layout\u height=“wrap\u content”
是一个选项,但我不确定如果没有内容实际加载到该视图中,该选项是否有效,因为内容包装是在充气时应用的,因为它没有适配器设置,所以无法完成


如果您需要从字面上“在ListView之外”检测侦听器,那么您需要在该片段的
rootView
上设置某种类型的单击/触摸侦听器

public View onCreateView(...) {
    rootView = inflater.inflate(...);

    listView = ...;
    listView.setOnTouchListner(...
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return false; // Says that click was not handled here. 
        }
    });

    rootView.setOnTouchListner(...
        // TODO: Check if click landed outside the ListView
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (v.getId() != android.R.id.listView) { // Not the list
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    // Up action more reliable than "down"

                    return true;
                }
            }
        }
    );
    return rootView;
}
我想这解决了你的问题



我想这就解决了你的问题。

我不明白如何找到外部的click
listView。setOnClickListener
将捕获整个视图。您的任务是决定是否单击列表中的某个项目,但如果我使用
listView.setOnClickListener
我在列表中找到了单击,我想知道当我在列表之外单击时是的,我将match\u parent放在外部布局中,它就工作了!但是我不明白为什么,你能给我解释一下吗?啊,我明白了,非常感谢!我没有使用您现在发布的代码,但是使用了前面的代码,但是它们或多或少都是相同的。我不明白如何找到外部的click
listView。setOnClickListener
将捕获整个视图。您的任务是决定是否单击列表中的某个项目,但如果我使用
listView.setOnClickListener
我在列表中找到了单击,我想知道当我在列表之外单击时是的,我将match\u parent放在外部布局中,它就工作了!但是我不明白为什么,你能给我解释一下吗?啊,我明白了,非常感谢!我没有使用你现在发布的代码,而是之前的代码,但它们或多或少是相同的less@PavneetSingh不,它不起作用。你想在片段中包含两部分,第一部分是listview,第二部分在listview的外面和下面。你想要第二个是可点击的吗?是吗?@mismnc是的,但是没有两种布局划分屏幕,理论上有一个listview占据了所有屏幕,但具体来说它只占据了一半,因为只有5个fragments@PavneetSingh不如果你想在片段中包含两个部分,第一个部分是listview,第二个部分在listview的外面和下面。你想要第二个是可点击的吗?是吗?@mismnc是的,但是没有两种布局划分屏幕,理论上有一个listview占据了所有屏幕,但具体来说它只占据了一半,因为只有5个片段。显式空视图应该可以工作。我没有想到:)我更喜欢这个解决方案,尽管它并不完全是“在ListView之外”,它只是“其他视图”,一个显式的空视图应该可以工作。我没有想到:)我更喜欢这个解决方案,尽管它并不完全是“在列表视图之外”,它只是“其他视图”
public View onCreateView(...) {
    rootView = inflater.inflate(...);
    View clickView = rootView.findViewById(...);
    clickView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Do something here
    }
});


    return rootView;
}