我有一个活动创建我的类的对象实例:
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 相关的操作。
您可以将主 Activity 的上下文(使用
Points(getApplicationContext());
)作为构造函数参数传递给类。您还可以传递您想要操作的特定 UI 元素。
但是,更好的方法可能是让
Points
不了解 Activity。让您的 Activity 调用 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);
}
}
这样做,可以从外部类触发/发送消息(由于缺乏更好的术语)来更新 Activity UI。如果所有的人都需要调用 Points 类中返回某些内容的方法,这可能有点过分了
制作重复的代码,我建议一种递归方法,该过程从方法本身在 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);
}