点击时我正在尝试更改textview的背景。
例如,如果单击文本视图,则背景将变为黄色并保持黄色,直到再次单击。然后它返回默认背景。
目前textview按下后面的背景更改,但在发布时返回默认值。
我已经在互联网上搜索解决方案并查看堆栈溢出的大部分解决方案,仍然没有解决方案。
绘制对象/ 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>
绘制对象/ 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>
绘制对象/ 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>
文字样式:
<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>
有人可以告诉我我做错了吗
感谢。
我的解决方案:
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>
活动
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());
}
答案 0 :(得分:6)
如果单击文本视图,背景将变为黄色并保持黄色,直到再次单击。然后它返回默认背景。
这是一个逻辑问题,因为你需要在你的点击监听器中保持当前的点击状态。(盲编码):
textView.setOnClickClickListener(new View.OnClickListener() {
private boolean stateChanged;
public void onClick(View view) {
if(stateChanged) {
// reset background to default;
textView.setBackgroundDrawable(circleOffDrawable);
} else {
textView.setBackgroundDrawable(circleOnDrawable);
}
stateChanged = !stateChanged;
}
});
要改进答案,您应该在活动中保留stateChanged
标记并在活动重新创建中保留其值 - 如果用户轮换活动。 (将标记存储在onSaveInstanceState
中,如果其参数不为空,则在onCreate
中恢复。)
答案 1 :(得分:5)
除上述答案外,请尝试使用此代码段。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<gradient android:endColor="#AD1F2D" android:startColor="#AD1F2D" />
</shape>
</item>
<item android:state_focused="true">
<shape>
<gradient android:endColor="#ff4b46" android:startColor="#ff4b46" />
</shape>
</item>
<item>
<shape>
<gradient android:endColor="#ff4b46" android:startColor="#ff4b46" />
</shape>
</item>
</selector>
我希望这对每个人都有用。
答案 2 :(得分:1)
为 Textview
使用 onclicklistener()在你的听众中使用
txt.setBackgroundColor(Color.RED);
例如
if(count==1)
{
txt.setBackgroundColor(Color.YELLOW);
count=0;
}
else
if(count==0)
{
txt.setBackgroundColor(Color.RED);
count==1;
}
答案 3 :(得分:0)
在onCreate()
方法中,
LinearLayout(or Whatever layout you are using) ll = (LinearLayout)findViewById(R.id.mainlay);
并在textview
上设置监听器:
TextView tv1 = (TextView)findViewById(R.id.maintext);
tv1.setOnClickListener(this);
最后点击:
@Override
public void onClick(View v) {
ll.setBackgroundColor(whatever color);
or If you want to change the text background color,
tv1.setBackground(whatevercolor);
}
希望这有帮助。
答案 4 :(得分:0)
万一有人需要它(Kotlin)。这可以在点击时切换 TextView 的背景和文本颜色。
ToggleTextView.kt
class ToggleTextView : AppCompatTextView {
private var mfilterSelected = false
constructor(context: Context, attrs: AttributeSet?, defStyle: Int): super(context, attrs, defStyle) {}`
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
constructor(context: Context, checkableId: Int) : super(context) {}
constructor(context: Context) : super(context) {}
fun isFilterSelected(): Boolean {
return mfilterSelected
}
fun toggleFilterState() {
if (mfilterSelected) {
background = resources.getDrawable(R.drawable.toggle_1)
setTextColor(resources.getColor(R.color.gray))
mfilterSelected = false
} else {
background = resources.getDrawable(R.drawable.toggle_2)
setTextColor(resources.getColor(R.color.white))
mfilterSelected = true
}
}
}
--toggle_1.xml--
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<stroke android:width="1dp" android:color="@color/gray" />
<corners android:radius="10dp" />
<solid android:color="@color/white" />
</shape>
--toggle_2.xml--
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners android:radius="10dp" />
<solid android:color="@color/orange" />
</shape>
Click listener in your Activity/Fragment:
yourTextView?.setOnClickListener {
yourTextView.toggleFilterState()
}
Usage in our xml layout file:
<ToggleTextView
android:id="@+id/yourTextView"
android:background="@drawable/toggle_1"
android:clickable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"/>