2011-06-14 2 views
5

Je suis vraiment coincé là-dessus. J'essaye de faire un simple changeur de textes qui augmentera une quantité et mettra à jour un prix basé sur la quantité. En ce moment dans mon xml j'ai quelque chose comme un TextView dans un TextSwitcher juste pour incrémenter la quantité. Je reçois le textview avec findViewById(R.id.quantity).TextSwitcher Erreurs NullPointer

donc ce que je dois trouver pour configurer la quantité d'incrément (je suis implemementing ViewFactory)

switcher = (TextSwitcher) findViewById(R.id.switcher); 
switcher.setFactory(this); 
quantity = (TextView) findViewById(R.id.quantity); 

Je PRÉPONDÉRANTS aussi makeView()

@Override 
    public View makeView() { 
     return quantity; 
    } 

Aussi quand un bouton d'incrément est pressé j'incrémente le compteur et place le texte sur le commutateur au compte courant. Comme ceci:

switcher.setText(String.valueOf(currentQuantity)); 

Quelqu'un peut-il me faire savoir ce que je fais mal ?? Je continue à obtenir mon nullpointer à cette ligne:

switcher.setFactory(this); 

Voici l'extrait de code XML:

<TextSwitcher android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/switcher"> 
      <TextView android:text="TextView" android:id="@+id/quantity" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> 
     </TextSwitcher> 
+0

Pouvez-vous poster votre XML? – Torid

+0

sûr que ive l'a mis à jour – HAxxor

Répondre

20

De l'Documentation for TextSwitcher:

setText (texte CharSequence) définit le texte de la vue suivante et passe à la vue suivante. Ceci peut être utilisé pour animer l'ancien texte et animer le texte suivant..

Ce qui signifie que vous aurez besoin d'au moins deux vues de texte, l'une avec l'ancien texte, et un pour recevoir le nouveau texte et animer en Le XML devrait fonctionner:

<TextSwitcher 
     android:id="@+id/counter" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="1"/> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"/> 
    </TextSwitcher> 
+0

J'ai mal compris "vous aurez besoin d'au moins deux vues de texte" 'android.view.InflateException: ligne de fichier XML binaire # 0: Impossible d'ajouter plus de 2 vues à un ViewSwitcher'; f – murt

+0

@murt Notez que cette réponse a été écrite en 2011, ils peuvent très bien avoir changé le comportement du ViewSwitcher depuis lors. – Jave

1

Assurez-vous que vous avez appelé setContentView avant la recherche du TextSwitcher

+0

il est défini sur le fichier xml correct. – HAxxor

+0

définissez-le sur le nom de votre fichier de disposition. par exemple, si votre mise en page est simplelist.xml, vous appelleriez 'setContentView (R.layout.simplelist)' (idéalement au début de votre méthode onCreate) –

+0

déjà défini. cela n'a rien à voir avec setContentView – HAxxor

1

Mmm..interesting, je avait juste le même problème ici. Dans mon cas, il y avait deux problèmes, d'abord je rendais null de makeView. Je crois que ce n'est pas votre cas car vous obtenez sa référence de findViewById (Attention, parfois cette méthode échoue et vous renvoie une référence nulle, je vous recommande d'y mettre un point d'arrêt et de vous assurer que vous n'avez pas de pointeur nul). Le deuxième problème que j'ai eu (et je pense que cela pourrait être le vôtre aussi) est que TextSwitcher ne s'attend pas à avoir une vue enfant, donc vous ne devriez pas mettre de TextView dedans comme vous le faites. Essayez de supprimer ce TextView et voir si cela fonctionne.

1

J'ai eu le même problème de wierd avec findViewById retournant null. Après quelques heures de creusement, j'ai finalement réussi à résoudre le problème: c'est une erreur dans mon code. Il y a de fortes chances que vous ayez des erreurs similaires.

Mon code était (pas de code d'origine, à des fins d'illustration):

public class MyTextSwitcher extends TextSwitcher { 
public MyTextSwitcher(Context context, AttributeSet attrs) { 
    super(context); 
} 

L'erreur est avec l'appel du constructeur. Code dans le constructeur doit être remplacé par ce qui suit pour faire fonctionner les choses:

super(context, attrs); // note the extra attrs parameter 

L'erreur (et des erreurs similaires dans d'autres classes) peuvent causer toutes les ressources « nouvelles » définies ne sont pas visibles à findViewById.

Honte à moi J'ai fait les mêmes erreurs deux fois aujourd'hui!