2017-03-29 8 views
0

私はテキストビューを更新したい翻訳アプリケーションを作っていますが、私が望むようにしていません。テキストビューを即座に更新できません

final audioTranslate at[] = new audioTranslate[1]; 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_audio_translate); 
    tv = (TextView) findViewById(R.id.textView11); 
    spokentext = (TextView) findViewById(R.id.textView12); 
    translatedtext = (TextView) findViewById(R.id.textView13); 
    at[0] = this; 
    start = (Button) findViewById(R.id.Start); 
    start.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Button b = (Button) v; 
      if (b.getText().toString().equals("Start")) { 
       //code 
      } 
      else{ 
       tv.setText(""); //these all 3 operations are happening after transfer method is finished. 
       b.setText("Wait"); 
       b.setEnabled(false); 
       transfer(); 
      } 
     } 
    }); 
} 

void transfer() { 
    Thread t = new Thread() { 
     public void run() { 
      //socket connection 
      //it is giving exception on below line too. 
      //Only the original thread that created a view hierarchy can touch its views. 
      //java.lang.RuntimeException 
      at[0].spokentext.setText(spoken); 
     } 
    }; 
t.start(); 
} 

これは参照のための私のレイアウトファイルです:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/activity_audio_translate" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="diverse.technologies.transcriber.audioTranslate"> 

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TableLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true"> 

     <TableRow 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:gravity="center_horizontal"> 

      <Button 
       android:text="Start" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@+id/Start" /> 
     </TableRow> 

     <TableRow 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_marginTop="20dp" 
      android:gravity="center_horizontal"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@+id/textView11" 
       android:textColor="@color/colorAccent" 
       android:textSize="24sp" /> 
     </TableRow> 

     <TableRow 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@+id/textView12" 
       android:textSize="26sp" 
       android:fontFamily="serif-monospace" 
       android:textStyle="normal|bold" /> 
     </TableRow> 

     <TableRow 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_marginTop="5px"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@+id/textView13" 
       android:textSize="24sp"/> 
     </TableRow> 

    </TableLayout> 
</ScrollView> 

</RelativeLayout> 

私は私が取得しています上記の例外と間違っているものを得ていませんよ。私は、テキストビューを持っているビューのオブジェクトを使用しています。助けてください。

+0

問題は正確に説明できますか? – Alvaro

+0

ワーカースレッドから 'UI'を更新できません –

+0

テクスチャtvをコード実行時に更新したいです。そして、私は、クラスをaudiotranslateするならオブジェクトを使ってスレッドからspokentextというテキストビューを更新することができません。 @Pavneet_Singh –

答えて

0

通常のワーカースレッドでは、TextViewなどのUI要素を変更できません。コードat[0].spokentext.setText(spoken);をUIスレッド内で実行します。私はネイティブJavaコーディングのこのタイプをお勧めしません。しかし側では、あなたのrunメソッドが

runOnUiThread(new Runnable() { 
       @Override 
       public void run() {//Your code}} 

を書きます。 @Pavneet_Singhはあなたが別のスレッドからあなたのUIを更新することはできません、言ったよう

void transfer() { 
Thread t = new Thread() { 
    public void run() { 
     //socket connection 
     //it is giving exception on below line too. 
     //Only the original thread that created a view hierarchy can touch its views. 
     //java.lang.RuntimeException 
     spokentext.post(new Runnable() { 
     @Override 
     public void run() { 
      at[0].spokentext.setText(spoken); 
     } 
    }); 

    } 
}; 
t.start(); 
} 
+0

しかし、私はこのアプリケーションの他の活動でも同じことをしました。そこではうまく動作します。しかし、ここでそれはしません。 –

+0

アクティビティはスレッドとは異なります。アクティビティはUIを直接変更できます。 –

0

あなたの転送方法に使用これを使用してください。 transfer()に電話する代わりに、このようにしたいと思うかもしれません。

public class YourActivity { 
    ... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     start.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Button b = (Button) v; 
       if (b.getText().toString().equals("Start")) { 
        //code 
       } else { 
        tv.setText(""); //these all 3 operations are happening after transfer method is finished. 
        b.setText("Wait"); 
        b.setEnabled(false); 
        new RetrieveSpokenTextTask().execute(); 
       } 
      } 
     }); 
    } 

    private class RetrieveSpokenTextTask extends AsyncTask<Void,Void,String> { 
     @Override 
     public String doInBackground(Void... params) { 
      String spoken = "the value you would like to assign to the TextView"; 
      return spoken; 
     } 

     @Override 
     public void postExecute(String text) { 
      // the `text` variable has now the string you returned in `doInBackground` 
      spokentext.setText(text); 
     } 
    } 
} 
+0

OKそれを試してみます。そして、コードが実行されるとすぐにテキストボックスのテキストを更新するにはどうすればいいですか? –

+0

これはポストディレイされていません – buradd

+0

だから私のtextview "tv"でもpostメソッドを使うべきです。すぐに更新する。 –

0

:ハンドラまたはAsyncTask

+0

@ abhishek-panjabi 'transfer()'の中で 't.start()'を呼び出さなくても例外を生成する方法を実行することができます。申し訳ありませんが、私はあなたの記事に直接コメントすることはできませんので、十分な評判がありません。 – bmdelacruz

+0

確かにt.start manを呼び出します。私は自分の質問にその行を入力することを忘れていた。 –

+0

AsyncTaskを使ってみましたか?多分それはあなたが使いたいと思うものです。 'doInBackground'メソッドの中で長時間実行しているタスクを実行し、' postExecute'メソッドでユーザインタフェースの変更を実行することができます。 – bmdelacruz

関連する問題