gpt4 book ai didi

java - Android:如何将界面从一个 Activity 发送到另一个 Activity

转载 作者:IT老高 更新时间:2023-10-28 20:26:55 25 4
gpt4 key购买 nike

我有一个这样的界面:

public interface MyInterface {
public void aMethod();
}

我的自定义对象:

public class MyObject {

private Context context;
private MyInterface inter;

public MyObject(Context context) {
this.context = context;
this.inter = (MyInterface) this.context;
inter.aMethod();
}
}

主 Activity :

public class MainActivity extends Activity implements MyInterface {

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

MyObject my = new MyObject(this);

}

@Override
public void aMethod() {
Toast.makeText(this, "done", Toast.LENGTH_SHORT).show();
}
}

在这里,在 MyObject 构造函数中,我可以从上下文中获取接口(interface),然后与 Activity 进行通信。

但是如何将界面从一个 Activity 发送到另一个 Activity ?
我需要从 Activity2 调用 Activity1 中的一个方法
有没有这样的方法?

注意:我不想使用 fragment 。

最佳答案

首先,这很糟糕:

this.inter = (MyInterface) this.context;

如果您将上下文传递给未实现您的接口(interface)的构造函数,您的应用程序将崩溃,并且很容易犯这样的错误。所以你看,这很容易出错,而是像这样实现它:

public class MyObject {

private Context context;
private MyInterface inter;

public MyObject(Context context, MyInterface inter) {
this.context = context;
this.inter = inter;
inter.aMethod();
}
}

这样更安全、更清洁。


要将 Object 发送到另一个 Activity 确保它像这样实现 Serializable:

public interface MyInterface extends Serializable {
public void aMethod();
}

现在您可以将接口(interface)作为额外的添加到启动另一个 ActivityIntent 中:

Intent intent = new Intent(context, OtherActivity.class);
intent.putExtra("interface", inter);
startActivity(intent);

OtherActivity 中,您可以像这样从 Intent 获取 Object:

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

Intent intent = getIntent();
MyInterface inter = (MyInterface) intent.getSerializableExtra("interface");

...
}

编辑:

当您在 Activity 中执行类似操作时,您正在创建一个匿名类:

OnCreateListener inter = new OnCreateListener() {

@Override
public void onObjCreate() {
Log.d("pltk", "dfgbfdgh");
}
};

关于这样一个匿名类的事情是它们不是静态的,这意味着您仍然可以从嵌套此监听器的类中访问方法和变量。内部原因是这个新类保留了对创建它的类的实例的引用,在你的例子中是封闭的Activity。这是一件很棒的事情,我们一直将它用于 OnClickListener 等。但在您的情况下,这是一个问题,因为您想将此 Object 发送到另一个 Activity 。对旧 Activity 的内部引用使其无法被序列化,这是一件好事。如果你可以像这样发送一个 Object ,你会因为垃圾收集器无法收集的所有旧引用而疯狂地造成内存泄漏。

解决方案非常简单,您可以在自己的文件中定义类,也可以将类设为静态。在这种情况下,静态意味着该类本质上被视为在它自己的单独文件中,因此无法访问封闭类的实例。

所以总结一下你要做的就是保持类嵌套并将其定义为静态,如下所示:

public class YourActivity extends Activity {

private static class OnCreateListenerImpl implements OnCreateListener {

@Override
public void onObjCreate() {
Log.d("pltk", "dfgbfdgh");
}
}

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

OnCreateListener inter = new OnCreateListenerImpl();
Intent in = new Intent(Palatok.this, SecondActivity.class);
in.putExtra("ob", inter);
startActivity(in);
}
}

或者您可以将实现移动到其自己的单独文件中:

public class OnCreateListenerImpl implements OnCreateListener {

@Override
public void onObjCreate() {
Log.d("pltk", "dfgbfdgh");
}
}

虽然我仍然不明白您为什么要将 OnCreateListener 发送到另一个 Activity 的原因,但这应该可以解决您的问题。

希望我能帮上忙,如果您有任何其他问题,请随时提出!

关于java - Android:如何将界面从一个 Activity 发送到另一个 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24780000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com