[英]Android: how to pass multiple values to setContentView() method from an activity class?
[英]How to pass values from a Class to Activity - Android
我有一个关于班级/任务/活动的新手问题。 我来自 C,所以我不知道这是否是做我需要的好方法。
我创建了一个类:
public class UDPServer {
private MyDatagramReceiver myDatagramReceiver = null;
private static int MAX_UDP_DATAGRAM_LEN = 1024;
private static int UDP_SERVER_PORT = 5000;
public void start() {
myDatagramReceiver = new MyDatagramReceiver();
myDatagramReceiver.start();
}
public void kill() {
myDatagramReceiver.kill();
}
private class MyDatagramReceiver extends Thread {
private boolean bKeepRunning = true;
private String lastMessage = "";
public void run() {
String message;
byte[] lmessage = new byte[MAX_UDP_DATAGRAM_LEN];
DatagramPacket packet = new DatagramPacket(lmessage, lmessage.length);
DatagramSocket socket = null;
try
{
socket = new DatagramSocket(UDP_SERVER_PORT);
while(bKeepRunning)
{
socket.receive(packet);
message = new String(lmessage, 0, packet.getLength());
lastMessage = message;
//Here should call activity method
});
}
}
catch (Throwable e)
{
e.printStackTrace();
}
finally
{
if (socket != null)
{
socket.close();
}
}
}
public void kill() {
bKeepRunning = false;
}
}
}
在我的活动中,我有:
@Override
public void onResume() {
super.onResume();
mUDPServer = new UDPServer();
mUDPServer.start();
}
@Override
public void onPause() {
super.onPause();
mUDPServer.kill();
}
现在,每次我收到一个数据包时,我都希望这个线程/类将接收到的数据包传递给一个 Activity 方法,该方法详细说明(做一些计算或更新一些 UI 等)这个传入数据。 但我不知道如何做到这一点,也许我的方法不正确。 我可以将线程代码放在 Activity 中,但它似乎使代码的可读性降低。
建议如何做到这一点?
@Anshul Jain 代码更新:
public class Main_activity extends Activity implements Interface_UDPServer{
TextView recived_message;
UDPServer mUDPServer;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
recived_message = (TextView)findViewById(R.id.recived_message);
}
@Override
public void onResume() {
super.onResume();
mUDPServer = new UDPServer(this);
mUDPServer.start();
}
@Override
public void onPause() {
super.onPause();
mUDPServer.kill();
}
public void sendData(final String str){
runOnUiThread(new Runnable() {
@Override
public void run() {
recived_message.setText(str);
}
});
}
}
XML文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_below="@+id/linearLayout"
android:layout_alignLeft="@+id/linearLayout"
android:layout_alignStart="@+id/linearLayout">
<TextView
android:id="@+id/recived_message"
android:layout_width="200dp"
android:layout_height="35dp"
android:textColor="#444444"
android:textSize="20dp" />
</LinearLayout>
</RelativeLayout>
为此,您可以使用回调。
定义一些接口,如
public interface MyCustomInterface(){
public void sendData(String str);
}
现在让你的 Activity 实现这个接口。
public class MyActivity implements MyCustomInterface {
@Override
public void sendData(String str){
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
recived_message.setText(str);
}
});
}
}
现在在UDPServer.java中,编写如下代码
public class UDPServer {
private MyCustomInterface interface;
UDPServer(MyCustomInterface interface){
this.interface = interface;
}
}
现在,只要您有一些可用数据,就可以说一个字符串,您可以像这样发送它
interface.sendData(str);
你有一个 A 活动和一个 B 活动,当你完成 B 活动方面的动作时,你需要它在你回来时影响 A 方。
创建一个Instance
类和一个你需要输入的方法,比方说;
public interface SelectedBirthday { void onSelectedData(String date); }
现在我们在B端,创建一个接口类的实例
private SelectedBirthday mCallback;
覆盖
@Override public void onAttach(Activity activity) { super.onAttach(activity); try { mCallback = (SelectedBirthday) activity; } catch (ClassCastException e) { Log.d("MyDialog", "Activity doesn't implement the ISelectedData interface"); } }
现在上传您需要的值
String userBirth = (day + " " + month + " " + year); mCallback.onSelectedData(userBirth);
好的,我们去A边
实现我们的接口类
implements SelectedBirthday
它会警告你它的方法并且你实现了它
@Override
public void onSelectedData(String date) {
if (!date.equals("")) {
txt_poup_age.setText(date);
//now you are free to do what you want with the value you received automaticaly
}
}
在 android 4 选项中执行此操作
Intent i = new Intent(current_class.this, linked_class.class); i.putextra("Key", value);
Intent i = new Intent(current_class.this, linked_class.class); i.putextra("Key", value);
并在另一个类中获取值(假设字符串值),例如:
String value = getIntent.getExtra("String key which you used when send value");
选项 2
A类{
公共静态字符串_utfValue =“”;
void sendValue(){ _utfValue = "某个值"; } }
并在您的 java 类中获取此值,例如:
String value = A._utfValue ;
我正在按照@Shadman Akhtar 的建议分享代码,并由@Singee 回复,这很有效。 单击按钮后,Textview 值将设置为您要从 retrivedata.java 发送到 MainActivity 的值。我已经使用 Button 来模拟可以在 retrivedata.java 中的异步方法
主活动.java
package com.example.interfacetesting;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements MyCustomInterface {
TextView tv1;
Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1=(TextView)findViewById(R.id.tv1);
btn1=(Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
retrivedata rd=new retrivedata(MainActivity.this);
rd.recievedataa();
}
});
}
@Override
public void sendData(String str){
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
tv1.setText(str);
}
});
}
}
MyCustomInterface.java //这是接口
package com.example.interfacetesting;
public interface MyCustomInterface{
public void sendData(String str);
}
retrivedata.java // 数据将从中发送到 MainActivity 的类。
package com.example.interfacetesting;
public class retrivedata{
private MyCustomInterface otherNameInterface;
retrivedata(MyCustomInterface otherNameInterface){
this.otherNameInterface = otherNameInterface;
}
void recievedataa()
{
otherNameInterface.sendData("---any string you want to send to mainactivity-------");
}
}
在你的情况下,我会使用活动作为界面。 该接口作为静态参数存储在 Application 类中。
有很多方法可以实现以下目标
你可以谷歌更多地了解这些方法并选择更适合你的方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.