2016-06-11 3 views
0

Je suis nouveau sur le développement Android, et j'ai encore des difficultés à comprendre le fonctionnement du framework. J'essaie d'écrire un jeu simple pour avoir de l'expérience et je voudrais demander de l'aide avec ce qui suit. Dans mon activité principale, j'ai quelques TextViews pour montrer diverses données de mon jeu, et sous celles-ci j'ai une vue personnalisée appelée AnimatedView qui a la toile où je dessine mes objets pour le jeu lui-même. Basé sur les objets sur le canevas, je voudrais mettre à jour les TextViews pour montrer, par exemple. Le problème est, même si je peux obtenir l'objet TextView avec le code ci-dessous, quand j'appelle textView.setText (...), rien ne change sur le UI.Mise à jour de l'interface utilisateur Android à partir de la vue personnalisée

Ce qui suit est une version simplifiée de mon code réel, pour démontrer le problème:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    ... 
    tools:context="com.danielsh.test.teststuff.MainActivity" 
    android:orientation="vertical"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myTextView" 
     android:text="Change this!" /> 

    <com.danielsh.test.teststuff.AnimatedView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/animView" /> 

</LinearLayout> 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

AnimatedView.java

public class AnimatedView extends View { 
    public AnimatedView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     final Handler uiHandler = new Handler(); 
     final Runnable runnable = new Runnable() { 
      public void run() { 
       LayoutInflater inflater = LayoutInflater.from(getContext()); 
       LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.activity_main, null, false); 
       TextView textView = (TextView) layout.findViewById(R.id.myTextView); 
       textView.setText("" + (System.currentTimeMillis()/1000)); 
       textView.invalidate(); 
      } 
     }; 

     uiHandler.postDelayed(runnable, 1000); 
    } 
} 

Je suppose que je ne travaille pas avec l'objet TextView réelle qui est visible sur l'interface utilisateur, mais pas sûr qu'as la bonne façon de le faire.

Toute aide ou pointeur vers un article existant traitant du même problème serait très apprécié.

+0

avez-vous essayé 'textView.invalidate();' après avoir défini le texte à l'intérieur –

+0

@SatyenUdeshi textView.invalidate(); ne fait pas de différence pour moi. –

+0

@tynn handler.postDelayed() est en effet plus agréable, malheureusement, a le même problème. –

Répondre

0

Ce que vous essayez de faire avec AnimatedView n'est pas clair pour moi, donc je ne serai pas en mesure de vous donner une vraie solution sur comment cela fonctionnerait correctement, seulement sur ce qui est votre problème ici. Si c'est votre implémentation complète, vous devriez peut-être essayer d'implémenter le comportement dans votre activité elle-même.

Dans votre publication Runnable vous gonflez votre mise en page à partir de XML. Cela signifie que vous créez de nouvelles mises en page et vues et que vous les affectez à votre variable locale. Ces vues ne font pas partie de la hiérarchie de disposition affichée dans votre activité. Ainsi, lorsque vous mettez à jour le texte du TextView, vous ne verrez jamais de changements n'importe où.

En tant que sidenote: Utilisez postDelayed(Runnable, long) au lieu de créer un nouveau Thread.

+0

Merci pour l'explication plus. Ce que vous avez dit a confirmé mon hypothèse, que je ne travaille pas avec la vue correcte. Alors, comment puis-je accéder aux vues de activity_main.xml à partir de mon AnimatedView.java? Sans utiliser inflate (par exemple, TextView textView = (TextView) findViewById (R.id.myTextView); ')' textView' est toujours null. –

+0

@DanielSH si le 'TextView' ne fait pas partie de la hiérarchie de vue de' AnimatedView', vous ne devriez pas y accéder du tout. Envisagez de mettre en place l'animation dans le cadre de votre activité. – tynn

+0

Merci, c'est prometteur. J'ai refacturé le code pour faire la mise à jour dans 'MainActivity.java', mais pour une raison quelconque, le code pour mettre à jour l'interface utilisateur ne s'exécute qu'une seule fois. J'ai mis mon échantillon à jour, pouvez-vous voir ce qui ne va pas? –