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

问题描述 投票:0回答:8

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

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 类吗?我到底该怎么做?

android android-context
8个回答
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);    
            }
        });
    }
}

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

1
投票

您应该做所有事情并将值传回活动来处理 UI,而不是在重点内容中执行任何与 UI 相关的操作。


1
投票

您可以将主 Activity 的上下文(使用

Points(getApplicationContext());
)作为构造函数参数传递给类。您还可以传递您想要操作的特定 UI 元素。

但是,更好的方法可能是让

Points
不了解 Activity。让您的 Activity 调用
Points
方法并根据方法输出采取必要的操作。


1
投票

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

Points myPoints = new Points(myView);

private class Points
{
  private TextView mTextView;

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

0
投票

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

  1. 创建静态变量和函数...
  2. 其他班级打来电话..

测试活动.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);
   }
}

测试2.java

TestActivity.setMSG("this is text");

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

}

这样做,可以从外部类触发/发送消息(由于缺乏更好的术语)来更新 Activity UI。如果所有的人都需要调用 Points 类中返回某些内容的方法,这可能有点过分了

    


0
投票
在 UI 线程上运行

制作重复的代码,我建议一种递归方法,该过程从方法本身在 UI 线程上运行。 events

在上面的示例中,您可以看到操作 UI 的目标方法。然后我们可以从其他类调用它,就像:

void setUiSynchronizing(boolean state) { if(Looper.getMainLooper().getThread() != Thread.currentThread()) { runOnUiThread(() -> { setUiSynchronizing(state); }); return; } ProgressBar pb = findViewById(R.id.sync_loading); if(state) pb.setVisibility(View.VISIBLE); else pb.setVisibility(View.GONE); }

© www.soinside.com 2019 - 2024. All rights reserved.