Android如何在按钮被按下或者获得焦点时让文本加粗

21

我想在按钮高亮或按下时将按钮内的文本加粗。我目前使用一个xml文件来定义这个按钮,并使用XML来改变它在按下时的外观,但我希望不使用图像来实现这一点。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true"
          android:state_pressed="false" 
          android:drawable="@drawable/reset_hover" />
    <item android:state_focused="true" 
          android:state_pressed="true"
          android:drawable="@drawable/reset_hover" />
    <item android:state_focused="false" 
          android:state_pressed="true"
      android:drawable="@drawable/reset_hover" />
    <item android:drawable="@drawable/reset" />
</selector>

我尝试使用以下代码,但它似乎从未被调用。

    final Button btn_reset = (Button) findViewById(R.id.btn_reset);
    btn_reset.setOnClickListener(this); 
    btn_reset.setOn(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus){btn_reset.setTypeface(null, Typeface.BOLD);}
        else{btn_reset.setTypeface(null, Typeface.NORMAL);}
    }
   });

你确定它没有被调用吗?也许可以在onfocuschange方法中添加一个logcat调用。我猜它可能会被多次调用(从而取消加粗效果)。 - DEzra
3个回答

36

你可以尝试将粗体代码放在按钮的点击事件内部:

final Button button = (Button) findViewById(R.id.button_id);
         button.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 // Set bold on click
                 button.setTypeface(null, Typeface.BOLD);
             }
         });

Eclipse没有自动为我找到Typeface类。我不得不手动输入import android.graphics.Typeface; - Al Lelopath
2
@mickey 感谢你的导入代码,相信它会帮助到未来的读者。 - DEzra
1
没有通过XML的方式来做这件事吗? - pblead26

4

注意!请查看下面的更新


您可以创建自己的style.xml文件,其中定义文本样式。在选择器中,您可以引用该样式。

<style name="myStyle">  
    <item name="android:textSize">9px</item>
    <item name="android:gravity">center_horizontal</item>
    <item name="android:textColor">#fff</item>
    <item name="android:textStyle">bold</item>
</style>

在您的选择器中

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true"
      android:state_pressed="false" 
      style="@style/myStyle" /> </selector>

更新于2020年:我的回答已经超过10年了,现在不再起作用!


3
选择器和样式配合起来有什么诀窍吗?我无法在我的代码中实现。 - Carl Manaster
18
这似乎并不可行,因为状态列表的内容必须是颜色或可绘制对象,并且当XML文件位于values/目录下时,顶级标签“selector”会引发错误。这个答案不应该被接受,因为它无法工作,或者没有提供足够的信息使其能够工作。 - Andrew Toulouse
5
看起来这对楼主和许多其他人有所帮助。将此标记为“不是答案”的人应该解释一下原因。我希望这个回答不是因为听起来好而被13个人投赞成票。 - markus
1
我的上面的回答已经超过3年了。它不再起作用 :( - Henry
3
这个被接受的解决方案不起作用!“选择器只适用于可绘制对象,而不适用于文本外观。目前没有计划改变这种情况。” https://code.google.com/p/android/issues/detail?id=8941 - pandre
显示剩余5条评论

3

选择器中不允许使用样式。 参考资料


要使文本加粗,请使用以下代码:

btn_reset.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) {
            // When the user clicks the Button
            case MotionEvent.ACTION_DOWN:
                btn_reset.setTypeface(Typeface.DEFAULT_BOLD);
                break;

            // When the user releases the Button
            case MotionEvent.ACTION_UP:
                btn_reset.setTypeface(Typeface.DEFAULT);
                break;
        }
        return false;
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接