这可能吗?我一直在使用与onAttach()进行Fragment-Activity通信的标准方式,我想知道是否可以这样做:
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");
}
});
这将允许我在显示Dialog的代码中维护一个线性逻辑流,而不是必须向Activity添加其他接口方法。
答案 0 :(得分:1)
这可能是一个很好的解决方案,但由于Activity
和Fragment
可以从已保存状态销毁并重新创建,因此此方案不可靠 - 在Fragment
&#39之后; s重新创建将不会引用Fragment
内的回调。
应该使用标准方案,包括将Activity
转换为onAttach()
中的回调接口,因为保证在onAttach()
之后调用Fragment
使用非空引用重新创建以封闭Activity
。这非常不方便,但这是Android Framework本身的限制。
不涉及接口和转换的解决方法:
我试过很多变种"界面和铸造"您希望避免使用的方法,并且所有这些方法确实感到肮脏和繁琐,因此,现在,我使用EventBus来支持Fragment
- 至 - 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();
}
}
片段:
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"));
}
}