Android 如何从我的班级访问活动UI?

Android 如何从我的班级访问活动UI?,android,android-context,Android,Android Context,我有一个创建类的对象实例的活动: file MyActivity.java: public class MyActivity extends Activity { TextView myView = (TextView)findViewById(R.id.myView); ... Points myPoints new Points(); ... } ---------------------------------------------------------

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

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类传递一些上下文吗?确切地说,我该怎么做?

您应该做所有事情,并将值传递回活动以处理UI,而不是在point stuff中执行任何与UI相关的操作。

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


但是,更好的方法可能是让
不知道该活动。让您的活动调用指向方法,并根据方法输出采取必要的操作。

您可以将视图传递给您的类

Points myPoints = new Points(myView);

private class Points
{
  private TextView mTextView;

  Points(TextView textView)
  {
     this.mTextView = textView;
  }
}
  • 您的
    不能是私有类而不是内部类。所以你的代码甚至没有编译
  • 将视图作为参数传递给
    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
            }
        }
    }
    

  • 回头见,我已经编辑过了,来解决这个问题

    希望有帮助:=)

    以下是编辑:

    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);    
                }
            });
        }
    }
    
    我也有同样的麻烦。。 我找到了简单的方法

  • 创建一个静态变量和函数
  • 从其他班级打来的电话
  • TestActivity.java
    Test2.java
    可以使用接口工作

    文件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);
        }
    }
    
    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);
        }
    
    }
    
    文件点。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);
        }
    }
    
    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);
        }
    
    }
    

    通过这种方式,可以从外部类触发事件/发送消息(缺少更好的术语),以更新活动UI。如果sb只需要在Points类中调用一个返回某些内容的方法,那么这可能太过分了。对不起,你解决了哪个问题?@Marcos:据我所知,你想从类点访问你的活动,也就是说,你想修改和更新你的TextView或ImageView等,我已经编辑了你的代码,但是管理员不接受编辑,我现在将在我的答案中发布它,等等:)你为什么编辑它而不发布答案?wtf XD回答得很好,谢谢。@Sipty:我编辑了他的问题让他理解,因为我不想复制粘贴答案中的所有代码,然后我在我的答案中为其他人添加了编辑过的部分:我正在尝试将此应用于我创建的应用程序,作为Firebase“入门”指南的一部分。我可以接收消息并在日志中看到它们。对于监听器,当应用程序是后台的时候,我甚至在通知中看到它们。但是现在我想用收到的消息更新textView。问题是Firebase消息服务显然是由magic实例化的,我没有机会将其传递给我的MainActivity上下文?dnt生成静态上下文