2013-09-21 29 views
6

Próbuję zmienić tło widoku tekstowego po kliknięciu.Zmiana koloru tła TextView na kliknięcie android

Na przykład, jeśli tekst jest kliknięty, tło zmienia się na żółte i pozostaje żółte aż do ponownego kliknięcia. Następnie wraca do swojego domyślnego tła.

Aktualnie tekst wyświetla zmiany tła po naciśnięciu, ale wraca do wartości domyślnej po zwolnieniu.

Mam wyszukiwania w Internecie dla rozwiązań i spojrzeć na większość rozwiązania na stackoverflow, nadal nie ma rozwiązania.

rozciągliwej/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> 

rozciągliwej/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> 

rozciągliwej/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> 

Styl tekstu:

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

Czy ktoś może mi powiedzieć co robię źle

Dzięki.

moje rozwiązanie:

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> 

aktywny

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

Czy chcesz zmienić tło po kliknięciu tekstu? – mike20132013

Odpowiedz

6

Jeśli TextView kliknięciu zmiany tła do żółtego i pozostaje żółty aż to kliknąć ponownie. Następnie wraca do swojego domyślnego tła.

To kwestia logiki, jak trzeba zachować w swoim click słuchacza aktualny stan click (ślepy kodowanie).

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

Aby poprawić odpowiedź, należy zachować stateChanged flagę w działalności i zachowują jego wartość w zakresie odtwarzania aktywności - jeśli użytkownik obróci aktywność. (Zapisz flagę pod numerem onSaveInstanceState i odtwórz w onCreate, jeśli jej parametr nie jest pusty.)

+0

dzięki. zadziałało – capiono

+0

nie ma za co ... po prostu zachowaj tę flagę w działaniach rekreacyjnych. – gunar

1

użyć onclicklistner() dla TextView

W słuchacza używać

 txt.setBackgroundColor(Color.RED); 

Na przykład

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

Jakikolwiek powód, dla którego nie używasz wartości logicznej dla 0/1? – JakeSteam

+0

Może być, jest z ** C ** tła: P –

0

W metodzie onCreate(),

LinearLayout(or Whatever layout you are using) ll = (LinearLayout)findViewById(R.id.mainlay); 

i ustawić słuchacza na textview:

TextView tv1 = (TextView)findViewById(R.id.maintext); 

tv1.setOnClickListener(this); 

i wreszcie na kliknij:

@Override 
public void onClick(View v) { 

ll.setBackgroundColor(whatever color); 
or If you want to change the text background color, 

tv1.setBackground(whatevercolor); 

} 

nadzieję, że to pomaga.

5

Oprócz powyższych odpowiedzi, spróbuj również tego fragmentu kodu.

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

Mam nadzieję, że przyda się wszystkim.