2010-08-25 28 views
1

J'ai un problème étrange avec StateListDrawable ou peut-être (probablement) il me manque quelque chose. J'ai créé une application de test pour cela et le même problème se produit. Alors, voici mon StateListDrawable resourse dans le fichier test_selection.xmlAndroid actualiser StateListDrawable problème

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_selected="true"> 
    <shape android:shape="rectangle" android:background="#ff0000"> 
    <corners android:radius="10dp" /> 
    <gradient android:startColor="#ff5555" 
    android:endColor="#ff5555" android:angle="0" /> 
    </shape> 
</item> 
<item android:state_selected="false"> 
    <shape android:shape="rectangle" android:background="#eeeeee"> 
    <corners android:radius="10dp" /> 
    <gradient android:startColor="#eeeeee" 
    android:endColor="#eeeeee" android:angle="0" /> 
    </shape> 
</item> 
</selector> 

Il est un sélecteur très simple qui tire une couleur rouge pour l'état sélectionné et un rectangle blanc pour une désélectionné.

Mon modèle main.xml est très simple. J'utilise simplement un TextView qui utilise la sélection comme arrière-plan.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<TextView android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:text="@string/hello" 
    android:textSize="30dp" android:id="@+id/test_view_example" android:background="@drawable/test_selection"/> 
<Button android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:id="@+id/refresh" 
    android:onClick="updateView" android:text="refresh"></Button> 
</LinearLayout> 

Mon code d'activité est également très simple.

public class TestDrawableStateActivity extends Activity { 

private final static int[] SELECTED_STATE = { android.R.attr.state_selected }; 
private final static int[] UNSELECTED_STATE = {}; 

private TextView textView; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    textView = (TextView) findViewById(R.id.test_view_example); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    // Carichiamo la Drawable 
    if(textView.getBackground().setState(SELECTED_STATE)){ 
    textView.invalidate(); 
    } 
} 

public void updateView(View view) { 
    if(textView.getBackground().setState(SELECTED_STATE)){ 
    textView.invalidate(); 
    }; 
} 
} 

Quand je commence l'activité tente de définir l'état de mon Drawable (le StateListDrawable) avec la valeur sélectionnée. Il semble tout très simple .... mais le problème est que l'état n'est pas montré. Si, plus tard, je clique sur un bouton et exécute la méthode updateView(), l'état change. Où est mon problème? Où ai-je tort?

Thankx beaucoup Max

Répondre

0

Enfin, je trouve la solution. Ça devrait être la même chose mais ça ne l'est pas. J'ai utilisé cette version onCreate()

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    textView = (TextView) findViewById(R.id.test_view_example); 
    textView.setSelected(true); 
} 

Etonnamment appellent setSelected(true) est différent que d'appeler setState() avec int[]{android.R.attrs.state_selected}. Ceci est dû à l'état interne de View.

Au revoir Max