2013-02-28 90 views

回答

29

最糟糕的是在这里找到了“名”这个项目以及它是如何被称为主题内。于是我浏览了android SDK文件夹中的每个drawable,最后找到名为“text_select_handle_middle”,“text_select_handle_left”和“text_select_handle_right”的drawable。

因此,解决办法很简单:这些绘图资源与定制设计/颜色添加到您的绘制文件夹,然后将它们添加到您的主题风格的定义,如:

<style name="MyCustomTheme" parent="@style/MyNotSoCustomTheme"> 
     <item name="android:textSelectHandle">@drawable/text_select_handle_middle</item> 
     <item name="android:textSelectHandleLeft">@drawable/text_select_handle_left</item> 
     <item name="android:textSelectHandleRight">@drawable/text_select_handle_right</item> 
</style> 
+1

如何从代码做呢? – ant 2014-06-12 15:20:03

+0

晚会有点晚,但请参阅下面关于如何以编程方式执行此操作的答案。 @ant – 2014-12-05 00:55:27

+0

伟大的工作对我来说 – 2016-02-23 07:58:06

11

如何从代码做呢?

try { 
    final Field fEditor = TextView.class.getDeclaredField("mEditor"); 
    fEditor.setAccessible(true); 
    final Object editor = fEditor.get(editText); 

    final Field fSelectHandleLeft = editor.getClass().getDeclaredField("mSelectHandleLeft"); 
    final Field fSelectHandleRight = 
     editor.getClass().getDeclaredField("mSelectHandleRight"); 
    final Field fSelectHandleCenter = 
     editor.getClass().getDeclaredField("mSelectHandleCenter"); 

    fSelectHandleLeft.setAccessible(true); 
    fSelectHandleRight.setAccessible(true); 
    fSelectHandleCenter.setAccessible(true); 

    final Resources res = context.getResources(); 

    fSelectHandleLeft.set(editor, res.getDrawable(R.drawable.text_select_handle_left)); 
    fSelectHandleRight.set(editor, res.getDrawable(R.drawable.text_select_handle_right)); 
    fSelectHandleCenter.set(editor, res.getDrawable(R.drawable.text_select_handle_middle)); 
} catch (final Exception ignored) { 
} 
+2

是的,这是可能的方式之一。但反射不是好主意) – ant 2014-12-05 13:29:15

+1

如果我只想改变“mSelectHandleCenter”的颜色,而不是用新的drawable替换它,该怎么办?我怎样才能做到这一点?不幸的是,我不得不使用反射,因为我通过我们的API – nicopasso 2016-09-01 15:28:44

+3

@nicopasso,https://gist.github获得了新的“重音颜色”。com/jaredrummler/2317620559d10ac39b8218a1152ec9d4您可以通过删除两个阵列中的左侧和右侧字段名称来更改该方法以仅着色中心句柄。 – 2016-09-01 17:56:42

1

你可以看到http://androiddrawables.com/Other.html这些属性。

改变你的价值观/ styles.xml,例如:

<style name="AppTheme.Cursor" parent="AppTheme"> 
    <item name="colorAccent">@color/cursor</item> 
</style> 

其中@色/光标在值/ color.xml增加。之后,将样式应用于活动:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setTheme(R.style.AppTheme_Cursor); 
    ... 

访问How to change EditText pointer color (not cursor)其他解决方案。

+0

这是行不通的。测试Nexus 5与Android 6和Nexus 4与Android 5. – 2017-08-03 08:28:31

+0

@androiddeveloper,我不能说现在。我在运行Android 5的三星Galaxy Tab A上测试了此代码。现在我认为其他解决方案更可取,因为它们不会更改colorAccent(这可能会影响其他控件)。 – CoolMind 2017-08-03 20:54:17

5

我意识到这确实很晚,但如果您只想更改句柄的颜色,则只需将以下内容添加到styles.xml文件即可。

<style name="ColoredHandleTheme"> 
    <item name="colorControlActivated">@color/colorYouWant</item> 
</style> 

然后就是设置任何活动抱着要影响EditText主题。

或者,如果你想将它应用范围,你可以做到以下几点:

<style name="ColoredHandleThemeForWholeApp"> 
    <item name="colorAccent">@color/colorYouWant</item> 
</style> 

,并为整个应用程序这一主题。

问题解决!

+0

我不认为colorControlActivated直接将其设置为EditText时可以工作。只在活动级别(通过清单)中起作用。使用Android 6测试Nexus 5,使用Android 4.4.4测试Nexus 4。 – 2017-08-03 08:14:59

+0

也许没错。我没有说它可以在单个EditText上工作。我说你可以在一个活动或应用程序范围内设置它。 – LukeWaggoner 2017-08-04 23:06:23

+0

哦,好的。对不起,谢谢。你知道这样的解决方案吗? – 2017-08-06 11:25:13

2

为了改变选择手柄的颜色,可以选择覆盖激活的颜色在您的应用主题:

<style name="MyCustomTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> 
    <item name="android:colorControlActivated">@color/customActivatedColor</item> 
</style> 
+0

任何方式使它仅适用于活动中的特定EditText,而不是全部? – 2017-08-03 08:29:14

+0

当然,您可以通过在布局中声明它们以使用您的自定义样式来使用此样式,仅用于特定的EditText。 – 2017-08-03 16:10:05

+0

它在特定的EditText上不适用于我。仅在活动级别(使用清单)。你可以试试吗? – 2017-08-06 11:29:51