zooky
zooky

Reputation: 171

How do i change text color when button was pressed once (Android)

what i basically wanna do is this: When i click on the button i want its Text color to appear in a different color. What i tried is this:

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

and then i did use this selector as drawable on the button android:textColor

but this doesn solve it since it only changes its color while i press the button. I want it like this: Default: black on click: blue on click again: black

any ideas how to do that? :S

this is my shape for the button (if it matters):

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

thx in advance

EDIT

so i tried to do it programatically and tied the folowing just to see if it changes color´s ..but yea..it doesn´t (it seems like my onCLick event doesnt work):

 @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;
}

}

NOTE: i do all tht stuff in onCreateView since im in a Fragment of my ActionBarActivity(with tabs) if im doing it in the onCreate i get a null pointer exception at findViewById ( since it searches for the ID in my mainActivity, if im right?)

so yea..any ideas?

Upvotes: 3

Views: 5620

Answers (6)

Opiatefuchs
Opiatefuchs

Reputation: 9870

If You want to have a behaviour like:

  • First Click: Button text black
  • Second Click: Button text blue
  • third Click: button text black again

I don´t think it´s possible with the selector, also not with state focused. Because if any other view will be clicked, the button is not focused anymore and will loose the textcolor, goes back to default. You have to do it in a programmatically way:

First, set the default textColor to what You want: black inside Your xml. So than You have the color on no press. make a globa variabel to save the state:

 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;
          }

        }

    });

That´s just a possible solution, there are many ways..

EDIT

for Your code:

Create that global variables like i did in my example above, and use them in the if/else statement:

    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;
      }

    }
});

Upvotes: 1

Morteza
Morteza

Reputation: 550

You can use this code to do it programmatically:

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;

       }
   }
});

Upvotes: 1

Rohit Chaskar
Rohit Chaskar

Reputation: 93

It seems like you wanna implement something like toggle button. Instead of button u can use toggle button. Though if you wanna use button only then u need to do some changes in your java code as well as xml code also

Create a file def_btn.xml it will look like this..

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

Create another file press_btn.xml it will look like this..

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

Inside your activity declare a private boolean variable(say isPressed) by default isPressed is false. & for default button background will be def_btn.xml

Now write following in button's onClick event.

    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);
            }
        }
    });

That's it..

Upvotes: 0

JBA
JBA

Reputation: 2899

If you do not mandatorily need a simple Button, you could use a ToggleButton that is made for binary-state handling... With a ToggleButton your selector would look like this :

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

Upvotes: 0

Fahim
Fahim

Reputation: 12358

Try adding 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>

add this line in button control

android:textColor="@drawable/text_effect"

It will work. Enjoy:)

Upvotes: 0

Varundroid
Varundroid

Reputation: 9234

Your 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>

Your button in 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"/>

Upvotes: 2

Related Questions