クラスのオブジェクトインスタンスを作成するアクティビティがあります。
file MyActivity.Java:
public class MyActivity extends Activity {
TextView myView = (TextView)findViewById(R.id.myView);
...
Points myPoints new Points();
...
}
--------------------------------------------------------------
file Points.Java:
private class Points {
...
HOW TO USE myView HERE ???
...
}
--------------------------------------------------------------
クラスでUIオブジェクト(アクティビティを拡張しない)を使用するにはどうすればよいですか? Pointsクラスにコンテキストを渡す必要がありますか?正確にはどうすればよいですか?
問題を修正するために、投稿を参照してください。編集しました。
それが役立つことを願っています:=)
ここに編集があります:
file MyActivity.Java:
public class MyActivity extends Activity {
TextView myView ;
protected void onCreate(Android.os.Bundle savedInstanceState) {
myView = (TextView)findViewById(R.id.myView);
Points myPoints = new Points(this);
myPoints.displayMsg("Hello World !!!");
}
}
--------------------------------------------------------------
file Points.Java:
private class Points {
protected MyActivity context;
//add a constructor with the Context of your activity
public Points(MyActivity _context){
context = _context;
}
public void displayMsg( final String msg){
context.runOnUiThread(new Runnable() {
@Override
public void run() {
context.myView.setText(msg);
}
});
}
}
Points
は、内部クラスでないとプライベートクラスになることはできません。だからあなたのコードはコンパイルさえしません...ビューをパラメーターとしてPoints
クラスのコンストラクターに渡します。
public class MyActivity extends Activity {
TextView myView = (TextView)findViewById(R.id.myView);
Points myPoints new Points(myView);
private class Points {
public Points(TextView view) {
// todo
}
}
}
ポイントのものでUI関連のことを行うのではなく、すべてを行い、UIを処理するアクティビティに値を返す必要があります。
メインアクティビティのコンテキストを(Points(getApplicationContext());
を使用して)コンストラクターパラメーターとしてクラスに渡すことができます。操作する特定のUI要素を渡すこともできます。
ただし、それを行うためのより良い方法は、Points
にアクティビティについて知らないようにすることです。アクティビティでPoints
メソッドを呼び出し、メソッドの出力に基づいて必要なアクションを実行します。
ビューをクラスに渡すことができます。
Points myPoints = new Points(myView);
private class Points
{
private TextView mTextView;
Points(TextView textView)
{
this.mTextView = textView;
}
}
私は同じ問題を抱えていました..私は簡単な方法を見つけました..
public class TestActivity extends Activity {
static EditText edit_text1;
public void onCreate(Bundle savedInstanceState)
{
.....
edit_text1 = (EditText) findViewById(R.id.edit_text1);
.....
}
public static void setMSG(String str)
{
edit_text1.setText(str);
}
}
TestActivity.setMSG("this is text");
インターフェイスを使用して動作する可能性があります
ファイルMyActivity.Java:
public class MyActivity extends Activity implements Points.MyListener {
TextView myView;
... onCreate(...){
myView = (TextView)findViewById(R.id.myView);
Points myPoints = new Points();
//pass in MyActivity's instance of the listener
myPoints.addListener(this);
}
@Override
public void updateTextView(String message){
myView.setMessage(message);
}
}
ファイルPoints.Java:
public class Points {
public Points(){
}
public interface MyListener{
void updateTextView(String message);
}
MyListener myListener;
public void addListener(MyListener listener){
myListener = listener;
}
public void updatePoints(){
//do some operations in calculatePoints()
String points = calculatePoints();
//update views using MyActivity's implementation of updateTextView()
myListener.updateTextView(points);
}
}
このようにすると、events
が起動され、メッセージが外部クラスから送信されて、アクティビティUIが更新されます。 sbに必要なのが、何かを返すPointsクラスのメソッドを呼び出すことだけである場合、これはやり過ぎかもしれません。