如何在按一次按钮时更改文本颜色(Android)

时间:2015-02-17 09:05:09

标签: android

我基本上想做的是: 当我点击按钮时,我希望其文本颜色以不同的颜色显示。 我试过的是这个:

<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

上使用此选择器作为drawable

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

任何想法如何做到这一点? :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,如果我对吗?)

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

6 个答案:

答案 0 :(得分: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"/>

答案 1 :(得分:1)

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

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;

       }
   }
});

答案 2 :(得分:1)

如果您想要这样的行为:

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

我不认为选择器是可能的,也不是关注状态。因为如果单击任何其他视图,该按钮将不再聚焦并且将松开文本颜色,返回默认值。您必须以编程方式执行此操作:

首先,将默认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;
      }

    }
});

答案 3 :(得分:0)

尝试添加text_effect.xml drawable

<?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"

它会起作用。享受:)

答案 4 :(得分:0)

如果您没有强制要求一个简单的Button,您可以使用为二进制状态处理而设置的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>

答案 5 :(得分:0)

好像你想实现像切换按钮这样的东西。 而不是按钮你可以使用切换按钮。 虽然如果你只想使用按钮,那么你需要对你的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);
            }
        }
    });

那是......