2016-04-10 12 views
0

私のAndroidアプリケーションに問題があります
TextViewでテキストを動的に更新しようとしていますが、UIに変更はありません。テキストが変更された場合にコードをチェックインすると(例えばトーストやデバッガを表示するなど)、GUIは更新されません。ここ
は私のコードです:Android runOnUiThreadはレイアウト要素を更新しません

<TextView 
    android:id="@+id/textViewNick" 
    android:gravity="bottom|left" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" /> 
public void changeNick(final String nick) 
{ 
    this.runOnUiThread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      View view = View.inflate(MyApplication.getAppContext(), R.layout.activity_nick, null); 
      TextView textViewNick = (TextView) view.findViewById(R.id.textViewNick); 
      textViewNick.setText(nick); 
     } 
    }); 
} 

changeNick()メソッドは他のクラスから呼び出されます。
誰もがなぜそうであり、それを修正する方法を知っていますか?前もって感謝します。

EDIT
私はchangeNick()方法が活動のonCreate()前に呼び出されていることが分かりました。 onCreate()に最後の命令としてフラグを追加し、changeNick()を呼び出す前にチェックしましたが、それでも役に立たず、IllegalStateException "onCreate()の前にアクティビティで利用できないシステムサービス"が表示されます。私はその活動の2つの異なるインスタンスを持っていたので

は、changeNick()方法が活動のonCreate()前に呼び出された
を解決しました。私はまだ作成されていないものに対して `changeNick()を実行していたので、NullPointerExceptionが発生しました。
とにかく、ありがとうございました。

+0

でテキストを変更する必要はありませんあなたはホスティングアクティビティのコンテキストでビューを膨らませる試みたことがありますか?私はあなたがアプリケーションのコンテキストを使用しているのを見て、それはあなたが望むものを与えないかもしれません。 – Benstrom

+0

こんにちはそれは解決され、またはまだいくつかの問題が残っている? –

答えて

1

それはあなたが変更する必要がタイムティックでTextViewを更新しようとし、そして、これは働いていたように行っているとき、私が直面した同じ問題、あなたはビューを毎回膨らませる必要はありません

public void changeNick(final String nick) 
{ 
    View view = View.inflate(MyApplication.getAppContext(), R.layout.activity_nick, null); 
    TextView textView = (TextView) view.findViewById(R.id.textViewNick); 
    new Thread(new Runnable() { 
     @Override 
     public void run() {   
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() {      
         textView.setText(nick); 
        } 
       }); 
     } 
    }).start(); 
} 
1

であってもよいのですあなたがアクティビティを使用している場合は、onCreate()メソッドでビューを初期化してビューを更新するだけです.OnUiThreadを実行する必要はありません。バックグラウンドスレッドから更新していないため、ビューを直接更新することはできません。あなたのために。

public class MyActivity extends Activity{ 
TextView textView; 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.your_activity); 
     textView = (TextView) findViewById(R.id.textViewNick); 
} 

public void changeNick(final String nick) { 
    textView.setText(nick); 

} 
+0

私は試しましたが、残念ながらそれは動作しません。なぜなら、changeNickメソッドでこの参照がnullであり、NullPointerExceptionを取得するからです。私が書いたように、changeNickメソッドは別のクラスから呼び出されるので、runOnUiThreadが必要です。 – Sebastian

+0

xmlレイアウトファイルと同じIDを使用すると、TextViewのIDが正しくない可能性がありますか?私が編集で書いたように、 'onCreate()'の実行が終了する前に、私のメソッドが他のスレッドによって早期に呼び出されていることがわかりました。今私はそれを避ける方法を探しています。 – Sebastian

+0

とoncreate()の前にメソッドをどのように呼び出すのですか?あなたはどこからそれを呼んでいますか?呼び出しが行われている場所全体のコードを表示すると、より役立つでしょう –

0

単にテキストを設定するには、次の行を使用します。

textView.setText(nick); 

UI-Thread

関連する問題