7

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

5 に答える 5

7

テキストビューをクリックすると、背景が黄色に変わり、もう一度クリックするまで黄色のままです。その後、デフォルトの背景に戻ります。

クリックリスナーで現在のクリック状態を保持する必要があるため、ロジックの問題です(ブラインドコーディング):

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には、アクティビティにフラグを保持し、アクティビティの再作成全体でその値を保持する必要があります (ユーザーがアクティビティをローテーションする場合)。(フラグを格納し、パラメータが null でない場合はonSaveInstanceState復元します。)onCreate

于 2013-09-21T19:30:09.030 に答える
1

Textview にonclicklistner ()を使用する

あなたのリスナーの使用で

      txt.setBackgroundColor(Color.RED); 

例えば

    if(count==1)
    {
      txt.setBackgroundColor(Color.YELLOW); 
      count=0;
      } 
       else
    if(count==0)
      { 
         txt.setBackgroundColor(Color.RED); 
       count==1;
          }
于 2013-09-21T19:30:40.423 に答える