在Android上点击更改TextView背景颜色

7

我试图在文本视图被点击时改变其背景。

例如,如果单击文本视图,则背景颜色将更改为黄色,并保持黄色,直到再次单击。然后它将返回到默认的背景。

目前,文本视图在按下时会更改背景,但在释放时返回到默认状态。

我已经在互联网上搜索了解决方案,并查看了stackoverflow上的大部分解决方案,仍然没有找到解决方案。

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>

可绘制/圆形_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
                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());
}

你想在点击TextView时更改背景吗? - mike20132013
5个回答

11

除了上面的答案,也可以尝试这段代码。

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

我希望这对每个人都有用。


还需添加 android:exitFadeDuration="200" 以设置持续时间,参见 https://dev59.com/r3E85IYBdhLWcg3wx2n2#58238863。您可以删除 android:state_focused 块。 - CoolMind

7
如果点击了TextView,背景色将变为黄色,并保持黄色直到再次点击。然后它会返回默认背景。
这是一种逻辑问题,因为您需要在单击侦听器中保留当前单击状态(盲目编码):
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中恢复,如果其参数不为空。)

不用谢...只需确保在活动重新创建时保留该标志。 - gunar

1

使用 onclicklistener() 为您的Textview

在您的监听器中使用

      txt.setBackgroundColor(Color.RED); 

例如。
    if(count==1)
    {
      txt.setBackgroundColor(Color.YELLOW); 
      count=0;
      } 
       else
    if(count==0)
      { 
         txt.setBackgroundColor(Color.RED); 
       count==1;
          }

你为什么不使用布尔值来表示0/1呢? - Jake Lee
1
可能他是来自C语言背景的 :P - Mehraj Malik

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

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

}

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接