Android_TextView学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)

猜你喜欢

转载自blog.csdn.net/hello_java_Android/article/details/79172134
今日推荐