有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何与来自不同类的UI交互

我想从其他类更新我的UI。我熟悉runOnUiThread()方法,但不知道如何在这个场景中实现它

public class UploadAct extends MainActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_upload);
    }

    //my code and functions would go here
}

然后,我的UploadData类

public class UploadData extends UploadAct {
    public void doSomethig(){
        printThis("I want to print this message to the UI");
    }

    public void printThis(String messsage) {
        final String mess = message;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(),mess,Toast.LENGTH_LONG).show();
                // I want this to display on the main thread
                txt_upload.setText(mess);// and this also
        }
    });
}

}


共 (4) 个答案

  1. # 2 楼答案

    首先,没有像某个类的UI这样的东西。有些活动可以处理UI小部件(例如TextView)。如果您想从UploadData类对UI进行一些更改,您必须以某种方式传递对该类的引用。可能由建造商:

    public class UploadData extends UploadAct{
    private TextView txt_upload;
    
    public UploadData(TextView tv)
    {
          txt_upload = tv;
    }
    public void doSomethig(){
    printThis("I want to print this message to the UI")
    }
    
     public void printThis(String messsage) {
        final String mess = message;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                           Toast.makeText(getApplicationContext(),mess,Toast.LENGTH_LONG).show();// I want this to display on the main thread
                txt_upload.setText(mess);// and this also
            }
        });
    }
    }
    

    我假设您在MainActivity中创建了DataUpload

  2. # 3 楼答案

    使用BroadcastReceiver

    // define a Broadcast Intent Action in String resources
    <string name="broadcast_id">MY_BROADCAST_ID</string>
    
    // register receiver in constructor/onCreate()
    MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
    IntentFilter myIntentFilter = new IntentFilter();
    myIntentFilter.addAction(context.getString(R.string.broadcast_id));
    context.registerReceiver(myBroadcastReceiver, myIntentFilter);
    
    // place your BroadcastReceiver in MainActivity, your UploadData class
    public class MyBroadcastReceiver extends BroadcastReceiver {
    
        public MyBroadcastReceiver(){
            super();
        }
        @Override public void onReceive(Context context, Intent intent) {
    
            Log.d(TAG, "Broadcast received");
            if(intent.getAction() != null && intent.getAction().equals(context.getString(R.string.broadcast_id)) ){
                // do something
            }
        }
    }
    
    // send Broadcasts from where you want to act, your UploadAct class.
    Intent intent = new Intent();
    intent.setAction(context.getString(R.string.broadcast_id));
    context.sendBroadcast(intent);
    Log.d(TAG, "Broadcast sent.");
    
    // you can unregister this receiver in onDestroy() method
    context.unregisterReceiver(myBroadcastReceiver);
    
  3. # 4 楼答案

    你也可以使用一个界面来更新你的用户界面作为一个监听器

    首先,创建一个接口

    public interface UpdateTextListener {
        void updateText(String data);
    }
    

    然后,在UploadData类中调用它的方法

     public class UploadData extends UploadAct {
    
         UpdateTextListener listener;
    
         public void doSomethig(){
             listener.updateText("data to be loaded");
         }
     }
    

    然后,通过听这个方法更新你的UploadAct

    public class UploadAct extends MainActivity  implements UpdateTextListener {
    
         @Override
         public void updateText(String  data) {
             textview.setText(data);
         }
    }