2016-06-11 4 views
0

私はAndroid開発が初めてで、フレームワークの仕組みを理解するのが難しいです。私はいくつかの経験を得るためにシンプルなゲームを書こうとしています。私は以下にいくつかの助けを求めたいと思います。 私の主なアクティビティでは、ゲームからのさまざまなデータを表示するためのTextViewがいくつかあります。その下に、ゲーム自体のオブジェクトを描画するキャンバスを持つAnimatedViewというカスタムビューがあります。キャンバス上のオブジェクトに基づいて、TextViewsを更新して、たとえば次のように表示したいと思います。オブジェクトの数、プレイヤーのレベルなど。カスタムビューからAndroid UIを更新する

問題は、以下のコードでTextViewオブジェクトを取得することはできますが、textView.setText(...)を呼び出すと、 UI。

以下は、問題を示すために、私の実際のコードの簡易版である:

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

私はUIに見えるの実際のTextViewオブジェクトで作業していないんだけど、わからないwhat'dはそれを行うための正しい方法であることを前提としています。

同じ問題を扱う既存の投稿へのヘルプやポインタは、大変ご満足いただけます。

+0

テキストを設定した後、 'textView.invalidate();'を試しましたか? –

+0

@SatyenUdeshi textView.invalidate();私のために違いはありません。 –

+0

@tynn handler.postDelayed()は実際にはより良いですが、残念ながら同じ問題があります。 –

答えて

0

あなたはAnimatedViewで何をしようとしているのか分かりませんので、ここで問題がある場合にのみ、正しく動作する方法について実際の解決策を教えていただけません。これがあなたの完全な実装であれば、おそらくそれをあなたのアクティビティ自体に実装しようとするべきでしょう。

投稿されたRunnableでは、レイアウトをXMLから拡張します。つまり、新しいレイアウトやビューを作成し、それらをローカル変数に割り当てることを意味します。これらのビューは、アクティビティーに表示されるレイアウト階層の一部ではありません。したがって、TextViewのテキストを更新すると、どこにも変更が表示されることはありません。

脇役として:Threadの代わりにpostDelayed(Runnable, long)を使用してください。

+0

詳細な説明をありがとう。あなたが言ったことは私の仮定を確認した、私は正しいViewで作業していない。 AnimatedView.javaからactivity_main.xmlのビューにアクセスするにはどうしたらいいですか? inflateを使用しない場合(たとえば、 'TextView textView =(TextView)findViewById(R.id.myTextView);)' textView'は常にnullです。 –

+0

@DanielSH 'TextView'が' AnimatedView'のビュー階層の一部でない場合、あなたは全くそれにアクセスすべきではありません。アクティビティの範囲でアニメーションを実装することを検討してください。 – tynn

+0

ありがとう、これは有望です。 'MainActivity.java'で更新を行うコードをリファクタリングしましたが、何らかの理由でUIを更新するコードが1回しか実行されません。 サンプルを更新しました。何が間違っているのがわかりますか? –

関連する問題