gpt4 book ai didi

java - 通过匿名接口(interface)进行 Fragment 到 Activity 的通信

转载 作者:行者123 更新时间:2023-11-30 01:05:14 25 4
gpt4 key购买 nike

这可能吗?我一直在使用标准的 Fragment-Activity 通信方式与 onAttach() 并想知道是否可以做这样的事情:

MainActivity.java

// Create Dialog passing in callback
MyDialogFragment dialog = MyDialogFragment.newInstance(param, new MyDialogInterface) {
@Override
public void onSelected(DialogFragment dialog, String result) {

}

@Override
public void onNotSelected(DialogFragment dialog) {

}
}

MyDialogFragment.java

// Execute callback
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
myInterface.onNotSelected(MyDialogFragment.this);
}
})
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
myInterface.onSelected(MyDialogFragment.this, "WORKED");
}
});

这将允许我在显示对话框的代码中保持线性逻辑流,而不是必须向 Activity 添加额外的接口(interface)方法。

最佳答案

这可能是一个很好的解决方案,但是由于 ActivityFragment 可以被销毁并从保存的状态重新创建,这个方案不可靠 - 在 Fragment 的重新创建不会引用 Fragment 中的回调。

应该使用标准方案,包括将 Activity 转换为 onAttach() 中的回调接口(interface),因为 onAttach() 保证在 Fragment 重新创建后使用对封闭 Activity 的非空引用调用。这非常不方便,但这是 Android Framework 本身强加的限制。

不涉及接口(interface)和转换的解决方法:

我尝试了很多你想避免的“接口(interface)和转换”方法的变体,所有这些方法确实让人觉得肮脏和麻烦,因此,现在,我使用 EventBus为了支持 Fragment-to-Activity 通信。总体方案是这样的(只显示相关部分):

Activity :

public class DemoActivity extends Activity {

@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}

@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}

@Subscribe
public void onDemoFragmentEvent(DemoFragment.DemoFragmentCallbackEvent event) {
Toast.makeText(this, "Event in Fragment happened: " + event.getWhatHappened(), Toast.LENGTH_LONG).show();
}
}

fragment :

public class DemoFragment extends Fragment {

/**
* Objects of this class will be posted on EventBus if anything happens in this Fragment
*/
public static class DemoFragmentCallbackEvent {

private String mWhatHappened;

public DemoFragmentCallbackEvent(String whatHappened) {
mWhatHappened = whatHappened;
}

public String getWhatHappened() {
return mWhatHappened;
}
}

public void somethingHappened() {
EventBus.getDefault().post(new DemoFragmentCallbackEvent("no interfaces and casting"));
}

}

关于java - 通过匿名接口(interface)进行 Fragment 到 Activity 的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38926548/

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