I'm trying to change the background of a textview when clicked.
For instance, if the textview is click it the background changes to yellow and remains yellow until it is click again. Then it returns to its default background.
Currently textview the background changes on pressed down, but returns to default on release.
I have search the internet for solutions and look at most of all the solution on stackoverflow, still no solution.
Drawable/selector.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/circle_on" android:state_enabled="true" android:state_pressed="true"/>
<item android:drawable="@drawable/circle_on" android:state_enabled="true" android:state_focused="true"/>
<item android:drawable="@drawable/circle_off"/>
</selector>
Drawable/circle_on:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<stroke
android:width="2dp"
android:color="@color/Gray" >
</stroke>
<solid android:color="@color/LightBlue" />
</shape>
Drawable/circle_off:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<stroke
android:width="2dp"
android:color="@color/Gray" >
</stroke>
<solid android:color="@color/WhiteSmoke" />
</shape>
TextView:
<TextView
style="@style/RoundText"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/repeat_selector"
android:clickable="true"
android:text="Sun" >
</TextView>
Text Style:
<style name="RoundText">
<item name="android:textColor">#555555</item>
<item name="android:gravity">center_vertical|center_horizontal</item>
<item name="android:textSize">15sp</item>
<item name="android:textStyle">bold</item>
<item name="android:fontFamily">sans-serif-thin</item>
</style>
Can someone please tell me what I'm doing wrong
Thanks.
MY Solution:
public class PlanTextView extends TextView {
private boolean _stateChanged;
private boolean _selected;
public boolean is_stateChanged() {
return _stateChanged;
}
public void set_stateChanged(boolean _stateChanged) {
this._stateChanged = _stateChanged;
}
public boolean is_selected() {
return _selected;
}
public void set_selected(boolean _selected) {
this._selected = _selected;
}
public PlanTextView(Context context) {
super(context);
}
public PlanTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PlanTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
}
<com.plan.views.PlanTextView
android:id="@+id/mon"
style="@style/RoundText"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/circle_off"
android:clickable="true"
android:onClick="PlanOnClick"
android:text="mon" >
</com.plan.views.PlanTextView>
Activity
public void PlanOnClick(View v) {
PlanTextView view = (PlanTextView)v;
if (view.is_stateChanged()) {
view.setBackgroundResource(R.drawable.circle_off);
view.set_selected(false);
} else {
view.setBackgroundResource(R.drawable.circle_on);
view.set_selected(true);
}
view.set_stateChanged(!view.is_stateChanged());
}
It's a matter of logic as you need to keep in your click listener the current click state.(blind coding):
To improve the answer, you should keep
stateChanged
flag in the activity and retain its value across activity recreations - if the user rotates the activity. (Store the flag inonSaveInstanceState
and restore inonCreate
if its parameter is not null.)Apart from the above answers,try this code snippet too.
I hope this will useful for everyone.
use a onclicklistner() for your Textview
In your listener use
For example
In the
onCreate()
method,and set the listener on
textview
:And finally on click:
Hope this helps.