web-dev-qa-db-ja.com

クラスからアクティビティUIにアクセスするにはどうすればよいですか?

クラスのオブジェクトインスタンスを作成するアクティビティがあります。

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クラスにコンテキストを渡す必要がありますか?正確にはどうすればよいですか?

14
MarcoS

問題を修正するために、投稿を参照してください。編集しました。

それが役立つことを願っています:=)

ここに編集があります:

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);    
            }
        });
    }
}
18
Houcine
  1. Pointsは、内部クラスでないとプライベートクラスになることはできません。だからあなたのコードはコンパイルさえしません...
  2. ビューをパラメーターとして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
            }
        }
    }
    
4
WarrenFaith

ポイントのものでUI関連のことを行うのではなく、すべてを行い、UIを処理するアクティビティに値を返す必要があります。

1
Rejinderi

メインアクティビティのコンテキストを(Points(getApplicationContext());を使用して)コンストラクターパラメーターとしてクラスに渡すことができます。操作する特定のUI要素を渡すこともできます。

ただし、それを行うためのより良い方法は、Pointsにアクティビティについて知らないようにすることです。アクティビティでPointsメソッドを呼び出し、メソッドの出力に基づいて必要なアクションを実行します。

1
Haphazard

ビューをクラスに渡すことができます。

Points myPoints = new Points(myView);

private class Points
{
  private TextView mTextView;

  Points(TextView textView)
  {
     this.mTextView = textView;
  }
}
1
Ben Williams

私は同じ問題を抱えていました..私は簡単な方法を見つけました..

  1. 静的変数と関数を作成します.。
  2. 他のクラスからの呼び出し。

TestActivity.Java

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

Test2.Java

TestActivity.setMSG("this is text");
0
nam

インターフェイスを使用して動作する可能性があります

ファイル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クラスのメソッドを呼び出すことだけである場合、これはやり過ぎかもしれません。

0
allo