如何从我的班级访问Activity UI?

时间:2011-05-17 12:47:57

标签: android android-context

我有一个活动,它创建了我的类的对象实例:

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类吗?我该怎么办?

7 个答案:

答案 0 :(得分:18)

看到你的帖子,我已经编辑过,以解决问题

希望它有所帮助:=)

这是编辑:

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

你应该做所有事情并将值传递给活动来处理UI,而不是在点内容中做任何与UI相关的东西。

答案 3 :(得分:1)

您可以将主Activity的上下文(使用Points(getApplicationContext());)作为构造函数参数传递给类。您还可以传递要操作的特定UI元素。

然而,更好的方法是让Points不了解活动。让您的Activity调用Points方法,并根据方法输出采取必要的操作。

答案 4 :(得分:1)

您可以将视图传递给您的班级。

Points myPoints = new Points(myView);

private class Points
{
  private TextView mTextView;

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

答案 5 :(得分:0)

我遇到了同样的麻烦.. 我找到了简单的方法..

  1. 制作一个静态变量和函数......
  2. 来自其他班级的电话..
  3. 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");
    

答案 6 :(得分:0)

可以使用界面工作

文件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。如果所有必要的事情只是调用Points类中返回某物的方法,这可能会过大了