版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hello_java_Android/article/details/79172134
Android4.4上EditText光标样式需要修改,追查一下系统实现,从系统层进行修改,记录一下。
查看TextView和EditText源码发现,EditText也是继承自TextView,在TextView的Constructor方法中,看到这么一行:
mMovement = getDefaultMovementMethod();
点进去发现是return的 null,再到EditText中看发现:
@Override
protected MovementMethod getDefaultMovementMethod() {
return ArrowKeyMovementMethod.getInstance();
}
跟到ArrowKeyMovementMethod中发现该类开始有如下注释:
/**
* A movement method that provides cursor movement and selection.
* Supports displaying the context menu on DPad Center.
*/
对,自由选择的实现类,但是为啥TextView中是返回的null呢?因为在TextView的构造方法中再往下看:
boolean editable = getDefaultEditable(); 获取是否可编辑的默认值,点进去发现返回false,不可编辑:
/**
* Subclasses override this to specify that they have a KeyListener
* by default even if not specifically called for in the XML options.
*/
protected boolean getDefaultEditable() {
return false;
}
那么子类EditText中肯定也是有此方法了,并且默认返回的是true:
@Override
protected boolean getDefaultEditable() {
return true;
}
虽然TextView默认false,不可编辑但是在代码或者xml中我们还是可以修改它的editable的,关于自由选择在这里暂不展开,主要是看EditText的
cursor实现,继续找,继续查看构造方法中有如下代码:
TypedArray a = theme.obtainStyledAttributes(attrs,
com.android.internal.R.styleable.TextViewAppearance, defStyleAttr, defStyleRes);
TypedArray appearance = null;
int ap = a.getResourceId(
com.android.internal.R.styleable.TextViewAppearance_textAppearance, -1);
a.recycle();
if (ap != -1) {
appearance = theme.obtainStyledAttributes(
ap, com.android.internal.R.styleable.TextAppearance);
}
获取自定义属性,并在接下来的for循环中给每个属性设置初始默认值,所以这些属性的默认值肯定是定义在了attrs或者style中了,
即对应的attr,找到cursorDrawable属性,查看对应的attr为:
case com.android.internal.R.styleable.TextView_textCursorDrawable:
mCursorDrawableRes = a.getResourceId(attr, 0);
break;
即textCursorDrawable,在attrs中可以看到如下定义:
在<declare-styleable name="TextView">中定义
<!-- Reference to a drawable that will be drawn under the insertion cursor. -->
<attr name="textCursorDrawable" format="reference" />
textCursorDrawable被定义成了引用类型,即设置类似drawable的样式,接下来在framework/base/core/res/res/目录下全局搜索textCursorDrawable,
在三个文件中有定义,分别是themes.xml、themes_hole.xml、themes_material.xml,但是在4.4源码中并未看到themes_hole.xml、themes_material.xml
这两个文件,这是因为Google推出的md风格支持5.0以上的平台,看到这里似乎找到了答案,接下来修改(删掉)themes_hole.xml、themes_material.xml这两个文件中
关于textCursorDrawable的定义,重新编译framework看下5.0的EditText光标和4.4的表现形式是否一样了,(framework没编译,先到这里),猜测4.4的可能是只是使用了
framework/base/core/res/res/nohdpi下的:
text_cursor_holo_dark.9.png
text_cursor_holo_light.9.png
而5.0以上的使用了framework/base/core/res/res/mhdpi下的text_cursor_mtrl_alpha.9.png,等带framework编译过了再来验证(3.0)
查看TextView和EditText源码发现,EditText也是继承自TextView,在TextView的Constructor方法中,看到这么一行:
mMovement = getDefaultMovementMethod();
点进去发现是return的 null,再到EditText中看发现:
@Override
protected MovementMethod getDefaultMovementMethod() {
return ArrowKeyMovementMethod.getInstance();
}
跟到ArrowKeyMovementMethod中发现该类开始有如下注释:
/**
* A movement method that provides cursor movement and selection.
* Supports displaying the context menu on DPad Center.
*/
对,自由选择的实现类,但是为啥TextView中是返回的null呢?因为在TextView的构造方法中再往下看:
boolean editable = getDefaultEditable(); 获取是否可编辑的默认值,点进去发现返回false,不可编辑:
/**
* Subclasses override this to specify that they have a KeyListener
* by default even if not specifically called for in the XML options.
*/
protected boolean getDefaultEditable() {
return false;
}
那么子类EditText中肯定也是有此方法了,并且默认返回的是true:
@Override
protected boolean getDefaultEditable() {
return true;
}
虽然TextView默认false,不可编辑但是在代码或者xml中我们还是可以修改它的editable的,关于自由选择在这里暂不展开,主要是看EditText的
cursor实现,继续找,继续查看构造方法中有如下代码:
TypedArray a = theme.obtainStyledAttributes(attrs,
com.android.internal.R.styleable.TextViewAppearance, defStyleAttr, defStyleRes);
TypedArray appearance = null;
int ap = a.getResourceId(
com.android.internal.R.styleable.TextViewAppearance_textAppearance, -1);
a.recycle();
if (ap != -1) {
appearance = theme.obtainStyledAttributes(
ap, com.android.internal.R.styleable.TextAppearance);
}
获取自定义属性,并在接下来的for循环中给每个属性设置初始默认值,所以这些属性的默认值肯定是定义在了attrs或者style中了,
即对应的attr,找到cursorDrawable属性,查看对应的attr为:
case com.android.internal.R.styleable.TextView_textCursorDrawable:
mCursorDrawableRes = a.getResourceId(attr, 0);
break;
即textCursorDrawable,在attrs中可以看到如下定义:
在<declare-styleable name="TextView">中定义
<!-- Reference to a drawable that will be drawn under the insertion cursor. -->
<attr name="textCursorDrawable" format="reference" />
textCursorDrawable被定义成了引用类型,即设置类似drawable的样式,接下来在framework/base/core/res/res/目录下全局搜索textCursorDrawable,
在三个文件中有定义,分别是themes.xml、themes_hole.xml、themes_material.xml,但是在4.4源码中并未看到themes_hole.xml、themes_material.xml
这两个文件,这是因为Google推出的md风格支持5.0以上的平台,看到这里似乎找到了答案,接下来修改(删掉)themes_hole.xml、themes_material.xml这两个文件中
关于textCursorDrawable的定义,重新编译framework看下5.0的EditText光标和4.4的表现形式是否一样了,(framework没编译,先到这里),猜测4.4的可能是只是使用了
framework/base/core/res/res/nohdpi下的:
text_cursor_holo_dark.9.png
text_cursor_holo_light.9.png
而5.0以上的使用了framework/base/core/res/res/mhdpi下的text_cursor_mtrl_alpha.9.png,等带framework编译过了再来验证(3.0)