zoukankan      html  css  js  c++  java
  • android中ScrollView的setOnClickListener无效

    近来意欲开发一款立Flag的APP,有一个部分类似便签,需要一个EditText,而这个EditText外边又套了一个ScrollView(不用ScrollView的话,内容如果超出屏幕,也可以滑动,不过我需要插入图片,如果不用ScrollView的话体验不好,这里不详细赘述),布局如下:

    <ScrollView
            android:id="@+id/sv_edit_view"
            android:layout_below="@id/et_edit_title"
            android:layout_above="@id/view_edit_1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="18dp"
            android:layout_marginRight="18dp">
    
            <EditText
                android:background="@null"
                android:id="@+id/et_edit_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="top"
                android:textSize="16sp"
                android:textColor="#fff"
                android:hint="请输入内容"/>
        </ScrollView>

    图形如下:
    这里写图片描述
    很显然,在没有内容的时候EditText只有一行那么高,而ScrollViewmatch-parent的,而我自然希望点击ScrollView的任何一个地方都能让EditText获得焦点,因此我写了如下代码:

    scrollView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.d("YYPT", "click the scrollView");
                    content.setFocusable(true);
                    content.setFocusableInTouchMode(true);
                    content.requestFocus();
                    AddFlagActivity.this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                }
            });

    本以为这么简单的一件事,随手就写了,然而点了之后什么反应都没有,Logcat里面也没有输出。

    经过查阅资料,将上述代码改成如下可解:

    scrollView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    //通知父控件请勿拦截本控件touch事件
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                    switch (motionEvent.getAction()){
                        case MotionEvent.ACTION_UP:
                            Log.d("YYPT", "click the scrollView");
                            //点击整个页面都会让内容框获得焦点,且弹出软键盘
                            content.setFocusable(true);
                            content.setFocusableInTouchMode(true);
                            content.requestFocus();
                            AddFlagActivity.this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                            break;
                    }
                     return false;
                }
            });

    原因嘛,ScrollView中的事件其实是有个先后顺序的,touch -> LongClick -> Click
    前面的事件的触发可能会阻止后续事件的触发,具体的可以看这篇博客:http://blog.csdn.net/msl0903/article/details/24205973

  • 相关阅读:
    [BestCoder Round #3] hdu 4907 Task schedule (模拟简单题)
    .NET中的PublicKeyToken以及强命名问题
    bug统计分析续(一)基于SQL的Bug统计方法
    iOS项目开发实战——通过Http Get方式与server通信
    TCP与UDP的区别(转)
    Telit GPRS模块测试报告
    GPRS优点介绍及GPRS上网相关知识(转)
    MC34063中文资料及应用实例(转)
    MC34063+MOSFET扩流 12V-5V 折腾出了高效率电路(转)
    Bluez SPP实现代码分析(转)
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287523.html
Copyright © 2011-2022 走看看