简体   繁体   English

OnTouchListener阻止ListView交互

[英]OnTouchListener blocks ListView interaction

I'm having a bit of an issue with the first Android layout I made. 我制作的第一个Android布局有点问题。 On my interface, I have an EditText at the top of my interface, with a ListView under, showcasing a list of elements. 在我的界面上,我在界面顶部有一个EditText,下面有一个ListView,其中展示了元素列表。 I want the EditText to lose focus and the virtual keyboard to disappear when the user touches the ListView. 当用户触摸ListView时,我希望EditText失去焦点,虚拟键盘消失。 I based myself off this page http://developer.android.com/guide/topics/ui/ui-events.html . 我基于此页面http://developer.android.com/guide/topics/ui/ui-events.html

The issue is, while my code does that, it also blocks any other form of interaction with the ListView itself (Can't navigate in the ListView, or select elements). 问题是,尽管我的代码做到了这一点,但它也阻止了与ListView本身的任何其他形式的交互(无法在ListView中导航或选择元素)。 Is there a way to re-establish the default behaviour along with the behaviour I added? 有没有办法重新建立默认行为以及我添加的行为?

Here is my MainActivity.java: 这是我的MainActivity.java:

public class MainActivity extends Activity {

    // Variable declarations
    EditText ed;
    ListView lv;

    // Function called when the application starts
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Elements declaration
        ed = (EditText) findViewById(R.id.search_text);
        lv = (ListView) findViewById(R.id.media_list);

        // Events declaration
        lv.setOnTouchListener(listViewListener);

        // We create a task to load the media list in a different thread.
        DownloadMediaList task = (DownloadMediaList) new DownloadMediaList (MainActivity.this,new TheInterface() {
            @Override
            public void theMethod(ArrayList<Media> result) {
                lv.setAdapter(new MediathequeListAdapter(MainActivity.this, result));
           }  
        }).execute();


    }

    private OnTouchListener listViewListener = new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent motion){
            ed.clearFocus();
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(ed.getWindowToken(), 0);
            return true;
        }

    };

    // Interface to communicate with the async load.
    public interface TheInterface {
        public void theMethod(ArrayList<Media> result);

         }

}

EDIT: Here is my main layout if that helps: 编辑:这是我的主要布局,如果有帮助的话:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true" >

    <LinearLayout android:id="@+id/container_search"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp">

        <EditText android:id="@+id/search_text"
            android:inputType="text"
            android:hint="@string/search_bar"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.80" />

        <Button android:id="@+id/search_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.20" />

    </LinearLayout>

    <ListView
        android:id="@+id/media_list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:dividerHeight="1dp" />

</LinearLayout>

Return false in your onTouch() . onTouch()返回false Otherwise you're telling the system that you've handled all touch events. 否则,您将告诉系统您已经处理了所有触摸事件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM