先摘抄下stackoverflow上一个启示了我的回答:

try by Changing your code as:





private OnClickListener saveButtonListener = new OnClickListener() {





    @Override

    public void onClick(View v) {

                Text1.clearFocus();

                Text2.clearFocus();

                saveButton.requestFocus(); //or any other View

    }





}

because as doc as about public void clearFocus () :





Called when this view wants to give up focus. If focus is cleared onFocusChanged(boolean, int, android.graphics.Rect) is called.





Note: When a View clears focus the framework is trying to give focus to the first focusable View from the top. Hence, if this View is the first from the top that can take focus, then all callbacks related to clearing focus will be invoked after wich the framework
will give focus to this view.

means you must set Focus to other view on button click because Text1 act as first View in your layout





意思就是说,当EditText的clearfocus清除焦点的时候,框架更倾向于把焦点给试图层上的第一个可以获取焦点的view



事实上View的属性里有一下配置分别相应不同的事件

android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="true"
android:enabled="true" android:state_enabled="false"
android:state_pressed="true"
android:state_focused="true"

非常熟悉这些东西。比較经常使用到的地方是在drawable文件下配置一个背景的selector.xml的时候有配置当获得焦点时显示什么背景,按下去什么背景,enabled为false什么背景。

可是开发项目中。我遇到的场景是:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <com.widget.TitleBar
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_gravity="top"
android:layout_height="49dp" > <TextView
android:id="@+id/titlebar_save"
android:layout_width="60dp"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
<span style="white-space:pre">	</span>    android:focusable="true"
        android:focusableInTouchMode="true"
android:background="@drawable/titlebar_btn_bg_selector"
android:gravity="center"
android:text="保存"
android:textColor="@color/common_white"
android:textSize="17sp" />
</com.widget.TitleBar> <ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="49dp"
android:scrollbars="none" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <RelativeLayout
android:id="@+id/account_head_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="25dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:paddingTop="25dp" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="头像"
android:textColor="@color/black_333333"
android:textSize="16sp" /> <ImageView
android:id="@+id/ico_set_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@color/transparent"
android:src="@drawable/ico_set_arrow"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"/>
<com.widget.RoundedImageView
android:id="@+id/account_head"
android:layout_width="76dp"
android:layout_height="76dp"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/ico_set_arrow"
android:scaleType="centerCrop"
android:src="@drawable/default_head" />
</RelativeLayout> <include
style="@style/setting_dividing_line_style"
android:layout_width="match_parent"
android:layout_height="1.5dp"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:layout_marginTop="10dp"
layout="@layout/widget_horizontal_dividing_line" /> <RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:paddingLeft="12dp"
android:paddingRight="20dp" > <TextView
style="@style/setting_item_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:text="昵称" /> <LinearLayout android:layout_width="0dp"
android:layout_height="0dp"
android:focusable="true"
android:focusableInTouchMode="true">
<requestFocus />
</LinearLayout> <com.widget.CustomInputBox
android:id="@+id/account_nickname"
android:layout_width="120dp"
android:layout_height="match_parent"
android:singleLine="true"
android:paddingTop="5dp"
android:gravity="center_vertical"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="@color/transparent" />
</RelativeLayout> <include
style="@style/setting_dividing_line_style"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
layout="@layout/widget_horizontal_dividing_line" /> <RelativeLayout
android:id="@+id/account_sex_layout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:paddingLeft="12dp"
android:paddingRight="20dp" > <TextView
style="@style/setting_item_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:text="性别" /> <TextView
android:id="@+id/account_sex"
style="@style/account_item_text_style"
android:layout_width="80dp"
android:layout_height="match_parent"
android:gravity="center_vertical|right"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:text="保密" />
</RelativeLayout> <include
style="@style/setting_dividing_line_style"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
layout="@layout/widget_horizontal_dividing_line" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:orientation="vertical"
android:paddingRight="0dp"
android:paddingBottom="20dp" > <TextView
style="@style/setting_item_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:text="个性签名" /> <include
style="@style/setting_dividing_line_style"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginLeft="12dp"
android:layout_marginRight="0dp"
android:layout_marginTop="10dp"
layout="@layout/widget_horizontal_dividing_line" /> <EditText
android:id="@+id/account_description"
style="@style/account_item_text_style"
android:hint="用一段话介绍自己..."
android:gravity="top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:paddingBottom="10dp"
android:background="@color/transparent"
android:ellipsize="end"
android:maxLines="3"
android:minLines="3" />
</LinearLayout>
</LinearLayout>
</ScrollView> </FrameLayout>

上面是我的layout,就一个比較简单的用户编辑,头部保存的textview设置了android:focusable="true"

            android:focusableInTouchMode="true"这两个属性,导致当按edittext获取焦点弹出软键盘后,编辑按保存的时候没有调用这个textview的setonclicklistener里面的onclick方法。

一直想不明确为什么,然后看到“当EditText的clearfocus清除焦点的时候,框架更倾向于把焦点给试图层上的第一个可以获取焦点的view”这句话,事实上是那些可以获取焦点的view。

这里的头部保存的textview事实上不是在top上的,个人认为不是。由于当我把头部的focus两个属性设为false后是能够点击到的。

(PS:默认的android:focusable="false" android:focusableInTouchMode="false"这两个属性是为false)。

这里我的判断是:当你为view配置了focusable属性后,同一时候也setOnclickListener了,假设其它的EditText获取焦点后,然后你点击可以focusable的view的时候发现这个view的onClick方法无法得到回调。也就是说focus和setOnClick事实上是两个互相矛盾的操作。android系统默认假设这个view已经focus获得焦点了,就不应该运行onClick。

看系统源代码也能多少推測到

static class ListenerInfo {
/**
* Listener used to dispatch focus change events.
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected OnFocusChangeListener mOnFocusChangeListener; /**
* Listeners for layout change events.
*/
private ArrayList<OnLayoutChangeListener> mOnLayoutChangeListeners; /**
* Listeners for attach events.
*/
private CopyOnWriteArrayList<OnAttachStateChangeListener> mOnAttachStateChangeListeners; /**
* Listener used to dispatch click events.
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
public OnClickListener mOnClickListener; /**
* Listener used to dispatch long click events.
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected OnLongClickListener mOnLongClickListener; /**
* Listener used to build the context menu.
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected OnCreateContextMenuListener mOnCreateContextMenuListener; private OnKeyListener mOnKeyListener; private OnTouchListener mOnTouchListener; private OnHoverListener mOnHoverListener; private OnGenericMotionListener mOnGenericMotionListener; private OnDragListener mOnDragListener; private OnSystemUiVisibilityChangeListener mOnSystemUiVisibilityChangeListener; OnApplyWindowInsetsListener mOnApplyWindowInsetsListener;
}

这个是class  View里面的一个内部类。观察发现有clicklistener,focuschangelistener等,所以事实上不要把focus和click混为一滩。

PS:假设有不同观点,欢迎留言交流

最新文章

  1. springMVC注解初步
  2. liquibase的使用
  3. 访问者(Visitor)模式
  4. Python3基础 print 查看一个列表中存储的所有内容
  5. mac下XAMPP服务器配置多站点配置局域网配置 (转)
  6. fatal error: Invalid layout of preloaded class
  7. linux0.11学习笔记(2)
  8. var与let的区别
  9. Axios源码阅读笔记#1 默认配置项
  10. 关于一些没做出来的SBCF题
  11. cos,sina,tan,cot
  12. Java 1.7 ThreadPoolExecutor源代码解析
  13. python pytest测试框架介绍一
  14. 实现运行在独立线程池的调度功能,基于Spring和Annotation
  15. 百度定位SDK实现获取当前经纬度及位置
  16. 学python着几个要搞清楚WSGI和uWSGI区别
  17. 磁盘512n,512e,4k原生磁盘的区别和操作系统支持
  18. cpu_test
  19. 关于LegacyExchangeDN的问题
  20. 【翻译】Django Channels 官方文档 -- Tutorial

热门文章

  1. ROS知识(5)----消息与服务的示例
  2. Struts+Hibernate+Spring常见问题
  3. Lower dc/dc-converter ripple by using optimum capacitor hookup
  4. 搭建windows server 2008 r2 FTP 后 开启防火墙无法访问的解决办法
  5. js继承——从创建对象开始
  6. Spring事务为什么不会自动回滚?Spring事务怎样才会自动回滚?事务自动回滚条件及手动回滚
  7. Alert Messager
  8. 《C++反汇编与逆向分析技术揭秘》之十——构造函数
  9. ssh免密登录方法不生效?Authentication refused: bad ownership or modes for directory
  10. C/C++下scanf的%匹配以及过滤字符串问题