1

これはばかげた考えかもしれませんが、あるアクティビティのオブジェクトから他の場所にアクセスできることを知っている人はいますか?

具体的には、アクティビティ A (textView t を使用) があり、通常の Java クラス B を作成するとします。

onCreate で、以下のような計算のために B の実行を開始します。

public class MyActivity extends Activity {
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    t = (TextView)findViewById(R.id.outputtext);
    Somejava B = new Somejava();
    B.run();
  }
}

BがtextViewを更新する方法はありますか?

簡単な方法 (おそらく正しい方法) は、B クラスから結果を返し、MyActivity で t.setText(result) を使用することですが、B でテキストビューを更新することは可能ですか?

4

4 に答える 4

1

Intent または public static 変数を使用する

于 2012-05-28T11:17:44.503 に答える
0

はい、アクティビティのフィールドが公開public Handlerされていて、最初に作成されたUIの変更を投稿することは可能ですActivityが、実際には、それを行うのは本当に醜いです...


インテントのシリアル化可能なデータを使用startActivityForResult(...)してプロセスがどのように通過したかを他のアクティビティに通知し、メソッドBundle extrasで結果をキャッチするために使用できます...overridedonActivityResult(...)

于 2012-05-28T11:21:26.530 に答える
0

コンストラクターでアクティビティ参照を b に渡すだけで、アクティビティでメソッドを作成してテキストビューを更新できます。別のスレッドを使用している場合は、ハンドラーまたはその他の方法で UI スレッドを更新することを忘れないでください。

于 2012-05-28T11:25:51.650 に答える
0

「通常のJavaクラス」の場合、B私は使用しますinterfaces

public interface SomejavaListener{
    void onSomejavaFinish(Object result);
}

public class MyActivity implements SomejaveFinish extends Activity {
  TextView t;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    t = (TextView)findViewById(R.id.outputtext);
    Somejava B = new Somejava();
    B.run(MyActivity.this); //notice the extra argument!
  }

  public void onSomejavaFinish(Object result){
    t.setText("updated! ^,^");
  }
}

public class Somejava {
    //...
    public void run(SomejavaListener callback){
        //working working
        callback.onSomejavaFinish( new Object() );
    }
}

ただし、Android 環境に関しては、問題が残っているので、おそらくAsyncTaskが適切であると感じました。これには、doInBackgroundUI スレッドを台無しにしない (結果として ANR エラーが発生する) メソッドがあります。もう 1 つの利点は、onPreExecuteメソッドonPostExecuteが UI スレッド自体で再び実行されるため、更新に瞬く時間がかかることです。TextView

public class MyActivity extends Activity {
    TextView t;

    private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... void) {
         //do your stuff
         return null
     }

     protected void onPostExecute(Void void) {
         MyActivity.this.t.setText("updated ^^v");
     }
 }

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    t = (TextView) findViewById(R.id.outputtext);
    MyAsyncTask myAsyncTask = new MyAsyncTask();
    myAsyncTask.execute();
  }
}
于 2012-05-28T11:29:50.103 に答える