2016-06-11 19 views
0

Ich bin neu in der Android-Entwicklung und habe immer noch Schwierigkeiten zu verstehen, wie das Framework funktioniert. Ich versuche, ein einfaches Spiel zu schreiben, um etwas Erfahrung zu sammeln, und ich möchte um Hilfe bitten. In meiner Hauptaktivität habe ich ein paar TextViews, um verschiedene Daten aus meinem Spiel zu zeigen, und darunter habe ich eine benutzerdefinierte Ansicht namens AnimatedView, die die Leinwand hat, auf der ich meine Objekte für das Spiel selbst zeichne. Basierend auf den Objekten im Canvas möchte ich die TextViews aktualisieren, um z. Anzahl der Objekte, welche Ebene der Player ist, etc.Android-Benutzeroberfläche von der benutzerdefinierten Ansicht aktualisieren

Das Problem ist, obwohl ich das TextView-Objekt mit dem folgenden Code abrufen kann, wenn ich TextView.setText (...) aufrufen, ändert sich nichts auf dem Benutzeroberfläche.

Das ist eine vereinfachte Version meiner echten Code, zu demonstrieren, das Problem:

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

Ich gehe davon aus, dass ich nicht mit dem eigentlichen Textview-Objekt gerade arbeite, die auf der Benutzeroberfläche, aber nicht sicher, was hat sein die richtige Art und Weise zu tun, dass sichtbar sind.

Jede Hilfe oder ein Zeiger auf einen vorhandenen Beitrag, der sich mit dem gleichen Problem beschäftigt, wäre sehr willkommen.

+0

haben Sie 'textView.invalidate();' versucht, nachdem Sie Text darin gesetzt haben –

+0

@SatyenUdeshi textView.invalidate(); macht keinen Unterschied für mich. –

+0

@tynn handler.postDelayed() ist in der Tat schöner, leider hat das gleiche Problem. –

Antwort

0

Es ist mir nicht klar, was Sie mit AnimatedView tun wollen, also kann ich Ihnen keine wirkliche Lösung geben, wie es richtig funktionieren würde, nur auf was Ihr Problem hier ist. Wenn dies Ihre vollständige Implementierung ist, sollten Sie vielleicht versuchen, das Verhalten in Ihrer Aktivität selbst zu implementieren.

In Ihrem geposteten Runnable pumpen Sie Ihr Layout von XML auf. Das bedeutet, dass Sie neue Layouts und Ansichten erstellen und diese Ihrer lokalen Variablen zuweisen. Diese Ansichten sind nicht Teil der Layouthierarchie, die in Ihrer Aktivität angezeigt wird. Wenn Sie also den Text des TextView aktualisieren, werden Sie nirgendwo Änderungen sehen.

Als Nebenbemerkung: Verwenden Sie postDelayed(Runnable, long) statt eine neue Thread zu erstellen.

+0

Danke für die Erklärung. Was Sie sagten, bestätigte meine Annahme, dass ich nicht mit der richtigen Ansicht arbeite. Wie kann ich auf activity_main.xml Aufrufe von meinem AnimatedView.java zugreifen? Ohne zu inflationieren (z. B. 'TextView textView = (TextView) findViewById (R.id.myTextView);') 'TextView' ist immer Null. –

+0

@DanielSH Wenn 'TextView' nicht Teil der Ansichtshierarchie von' AnimatedView' ist, sollten Sie nicht darauf zugreifen. Ziehen Sie in Betracht, die Animation im Rahmen Ihrer Aktivität zu implementieren. – tynn

+0

Danke, das ist vielversprechend. Ich habe den Code überarbeitet, um die Aktualisierung in 'MainActivity.java' durchzuführen, aber aus irgendeinem Grund wird der Code zum Aktualisieren der Benutzeroberfläche nur einmal ausgeführt. Ich habe meine Probe aktualisiert, können Sie sehen, was damit nicht stimmt? –