【问题标题】:How do i change text color when button was pressed once (Android)按下按钮一次时如何更改文本颜色(Android)
【发布时间】:2015-04-17 22:50:44
【问题描述】:

我基本上想做的是: 当我点击按钮时,我希望它的文本颜色以不同的颜色出现。 我尝试的是这样的:

<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:color="@color/red" />
    <item
        android:state_pressed="false"
        android:color="#000" />
</selector>

然后我确实将此选择器用作按钮 android:textColor 上的可绘制对象

但这并没有解决它,因为它只会在我按下按钮时改变它的颜色。 我想要这样: 默认:黑色 点击:蓝色 再次点击:黑色

任何想法如何做到这一点? :S

这是我的按钮形状(如果重要的话):

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetBottom="-1dp"
    android:insetLeft="-1dp"
    android:insetRight="-1dp">
    <selector>
        <item android:state_pressed="false">
            <shape android:shape="rectangle" >
                <corners
                    android:radius="0dp"
                    />
                <solid
                    android:color="@color/background_grey"
                    />
                <padding
                    android:left="0dp"
                    android:top="0dp"
                    android:right="0dp"
                    android:bottom="0dp"
                    />
                <size
                    android:width="100dp"
                    android:height="30dp"
                    />
                <stroke
                    android:width="1dp"
                    android:color="#ffb4b4b4"
                    />
            </shape>
        </item>

        <item android:state_pressed="true">
            <shape android:shape="rectangle" >
                <corners
                    android:radius="0dp"
                    />
                <solid
                    android:color="@color/pq_blue"
                    />
                <padding
                    android:left="0dp"
                    android:top="0dp"
                    android:right="0dp"
                    android:bottom="0dp"
                    />
                <size
                    android:width="100dp"
                    android:height="30dp"
                    />
                <stroke
                    android:width="1dp"
                    android:color="#ffb4b4b4"
                    />
            </shape>
        </item>
    </selector>
</inset>

提前谢谢

编辑

所以我尝试以编程方式执行此操作并将以下内容绑定只是为了查看它是否会改变颜色 ..但是是的..它没有(似乎我的 onCLick 事件不起作用):

 @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.listview_item, container, false);



    final Button likeButton = (Button)rootView.findViewById(R.id.btLike);
    likeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String test = "tester";
            if(BUTTON_STATE==BUTTON_STATE_ONCE){

                likeButton.setTextColor(getResources().getColor(R.color.pq_blue));
                BUTTON_STATE = BUTTON_STATE_TWICE;
            }else{
                likeButton.setTextColor(getResources().getColor(R.color.red));
                BUTTON_STATE = BUTTON_STATE_ONCE;
            }

        }
    });
    return rootView;
}

}

注意:我在 onCreateView 中做了所有事情,因为我在我的 ActionBarActivity 的片段中(带标签)如果我在 onCreate 中执行它,我在 findViewById 处得到一个空指针异常(因为它在我的 mainActivity 中搜索 ID,如果我是对的?)

所以是的..有什么想法吗?

【问题讨论】:

  • 如果您想要这样的行为,您必须以编程方式进行。选择器无法获得第二次或第三次点击的状态
  • 您不想以编程方式进行操作吗?
  • 这是否是您的解决方案?我想你被误解了,也许我误解了你,但你的目标是:默认:黑色,然后第一次点击:蓝色,然后第二次点击:黑色。不是吗?
  • 好的,谢谢...所以我真的需要以编程方式进行。有没有一种通用/简单的方法来做到这一点?或者只是用 onClickListener 处理它,在那里改变颜色并设置一些状态/标志,这样它就知道它改变了颜色。然后让 If(state) 颜色变回正常?

标签: android


【解决方案1】:

你的 textselector.xml -

<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:color="@color/red" /> <!--selected text colour-->
    <item
        android:state_focused="true"
        android:color="@color/red" />
    <item            
        android:color="@color/blue" /> <!--unselected text colour-->
</selector>

layout.xml 中的按钮 -

<Button
    android:id="@+id/btn1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Exit"
    android:textColor="@drawable/textselector" <!-- SET textselector HERE -->
    android:background="@drawable/button_color"/>

【讨论】:

  • 如果单击另一个视图,按钮将失去焦点状态,因此 textcolor 将变回黑色,同样无需第三次单击......
【解决方案2】:

您可以使用此代码以编程方式执行此操作:

myButton.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        ColorStateList myList=myButton.getTextColors();
        int myColor=myList.getDefaultColor();
        switch(myColor)
        {
            case Color.BLACK:
            myButton.setTextColor(Color.BLUE);
            break;

            case Color.BLUE:
            myButton.setTextColor(Color.BLACK);
            break;

       }
   }
});

【讨论】:

  • 但不是这样吗,使用 getDefaultColor(),你总是会得到黑色的,因为这是在选择器中设置为默认值的?.....所以开关状态不会得到正确的状态...
  • 好吧,我刚刚对其进行了测试,它对我有用,当然我没有那个 xml 样式,并且还考虑了 getTextColors();获取当前颜色不是 getDefaultColor();
  • 好的,但在 API 中它定义为:“获取不同状态(正常、选定、聚焦)的文本颜色......”。这对我来说意味着,所有使用的颜色都将在 ColorStateList 中,也是默认颜色,或者?
  • getDefaultColor();返回此 ColorStateList 中的默认颜色,而不是唯一的原始颜色,因此当以编程方式更改 Button 的颜色时,无需说明哪个状态(按下、聚焦、...)它将是默认颜色。
  • 啊你的意思是在按钮的xml布局中定义的默认颜色,而不是选择器的颜色?
【解决方案3】:

如果你想要这样的行为:

  • 首次点击:按钮文字黑色
  • 第二次点击:按钮文字蓝色
  • 第三次点击:按钮文字再次变黑

我认为选择器不可能,也不能以状态为中心。因为如果单击任何其他视图,按钮将不再聚焦并且会丢失文本颜色,返回默认值。您必须以编程方式进行:

首先,将默认 textColor 设置为您想要的:您的 xml 中的黑色。所以比你没有新闻的颜色。制作一个全局变量来保存状态:

 private int BUTTON_STATE = 0;
 private final int BUTTON_STATE_ONCE = 0;
 private final int BUTTON_STATE_TWICE = 1;



     button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {

          if(BUTTON_STATE==BUTTON_STATE_ONCE){

            button.setTextColor(Color.BLUE);
            BUTTON_STATE = BUTTON_STATE_TWICE;
          }else if(BUTTON_STATE==BUTTON_STATE_TWICE){

            button.setTextColor(Color.BLACK);
            BUTTON_STATE = BUTTON_STATE_ONCE;
          }

        }

    });

这只是一个可能的解决方案,有很多方法..

编辑

为您的代码:

像我在上面的示例中那样创建全局变量,并在 if/else 语句中使用它们:

    likeButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

           if(BUTTON_STATE==BUTTON_STATE_ONCE){

        likeButton.setTextColor(getResources().getColor(R.color.pqBlue));
        BUTTON_STATE = BUTTON_STATE_TWICE;
      }else if(BUTTON_STATE==BUTTON_STATE_TWICE){

        likeButton.setTextColor(getResources().getColor(R.color.pqBlack));
        BUTTON_STATE = BUTTON_STATE_ONCE;
      }

    }
});

【讨论】:

  • 我想这样做,但它不会改变颜色...知道为什么吗?检查我在此下方的评论..我无法在评论中正确显示它。我在我的 Fragment 中做所有这一切,这就是它在 onCreateView 中的原因,这就是我使用 rootView.findViewById 等的原因(如果是因为这个,它希望按钮是 final..idk)
  • public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.listview_item, container, false);最终按钮 likeButton = (Button)rootView.findViewById(R.id.btLike); likeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { likeButton.setTextColor(getResources().getColor(R.color.red)); } });返回根视图; }
  • 你能更新你的帖子吗?很难从评论中阅读代码。你有没有像我的例子一样定义状态,还有 if else 语句?
  • 这不起作用,因为它希望 BUTTON_STATE 是最终的,因为它用于内部类......如果你把它放在最终你不能改变值:SI 认为这就是为什么我不能改变颜色如果我只写下:likeButton.setTextColor(getResources().getColor(R.color.pqBlue));因为我的按钮是最终的,然后不能更改..这可能吗?如果这就是重点,那么我就有问题了,因为它必须是最终的(与上面相同......内部类中的用法):S
  • 不,您必须将这些变量设为全局变量,而不是在类内部。
【解决方案4】:

尝试添加 text_effect.xml 可绘制对象

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="true"
           android:color="@color/white" /> <!-- pressed -->    
     <item android:color="@color/black" /> <!-- default -->
 </selector>

在按钮控件中添加这一行

android:textColor="@drawable/text_effect"

它会起作用的。享受:)

【讨论】:

    【解决方案5】:

    如果您不需要一个简单的按钮,您可以使用一个用于二进制状态处理的 ToggleButton... 使用 ToggleButton,您的选择器将如下所示:

    <?xml version="1.0" encoding="utf-8"?>
       <selector xmlns:android="http://schemas.android.com/apk/res/android">
       <item android:state_checked="true" android:color="@color/red" />
       <!-- Default State -->
       <item android:color="#000" />
    </selector>
    

    【讨论】:

      【解决方案6】:

      您似乎想要实现类似切换按钮的功能。 您可以使用切换按钮代替按钮。 虽然如果你只想使用按钮,那么你需要在你的 java 代码以及 xml 代码中做一些更改

      创建一个文件def_btn.xml它看起来像这样..

          <?xml version="1.0" encoding="utf-8"?>
          <shape xmlns:android="http://schemas.android.com/apk/res/android"
                 android:shape="rectangle" >
                  <corners
                      android:radius="0dp"
                      />
                  <solid
                      android:color="@color/background_grey"
                      />
                  <padding
                      android:left="0dp"
                      android:top="0dp"
                      android:right="0dp"
                      android:bottom="0dp"
                      />
                  <size
                      android:width="100dp"
                      android:height="30dp"
                      />
                  <stroke
                      android:width="1dp"
                      android:color="#ffb4b4b4"
                      />
              </shape>
      

      创建另一个文件press_btn.xml它看起来像这样..

          <?xml version="1.0" encoding="utf-8"?>
          <shape xmlns:android="http://schemas.android.com/apk/res/android"
                 android:shape="rectangle" >
                  <corners
                      android:radius="0dp"
                      />
                  <solid
                      android:color="@color/pq_blue"
                      />
                  <padding
                      android:left="0dp"
                      android:top="0dp"
                      android:right="0dp"
                      android:bottom="0dp"
                      />
                  <size
                      android:width="100dp"
                      android:height="30dp"
                      />
                  <stroke
                      android:width="1dp"
                      android:color="#ffb4b4b4"
                      />
              </shape>
      

      在您的活动中声明一个私有布尔变量(比如 isPressed),默认情况下 isPressed 为 false。 & 默认按钮背景为 def_btn.xml

      现在在按钮的 onClick 事件中编写以下内容。

          btn.setOnClickListener(new View.OnClickListener() {
      
              @Override
              public void onClick(View v) {
                  isPressed = !isPressed;
      
                  if(isPressed){
                      btn.setBackgroundResource(R.drawable.def_btn);
                  }else{
                      btn.setBackgroundResource(R.drawable.press_btn);
                  }
              }
          });
      

      就是这样..

      【讨论】:

      • 我不想在我的文字下切换。而且切换按钮总是在文本下方提供一个“栏”,不是吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多