我有一个主要活动,其中有一堆碎片连接到它。
其中一个片段必须能够在中将数据加载到FragmentTransaction并提交后,才能从MainActivity 中接收数据。
在该特定片段中调用方法的最佳方法是什么?
我是否必须实现一个接口并将其包含在MainActivty中,仅用于这个片段?有没有更好的办法?有人能指出我正确的方向吗?
我现在尝试过:(在MainActivity的设置ContactsInterface失败)
ContactsInterface
public interface ContactsInterface {
void notifyDenied();
void notifyGranted();
}
片段
Class.... implements ContactsInterface...
@Override
public void notifyDenied() {
Log.d("DENIED", "DENIED CALLBACK");
}
@Override
public void notifyGranted() {
Log.d("GRANTED", "GRANTED CALLBACK");
}
主要活动
try {
contactsInterface = (ContactsInterface) this.getApplicationContext();
} catch (ClassCastException e) {
throw new ClassCastException(this.toString()
+ " Needs to implement the methods");
}
最后一个示例抛出ClassCastException。
答案 0 :(得分:1)
您需要转换片段本身而不是应用程序上下文。
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
ContactsInterface contactsInterface = (ContactsInterface) fragment;
//contactsInterface.notifyGranted();
//contactsInterface.notifyDenied();
答案 1 :(得分:0)
您可以获取FragmentManager
中的所有活动片段并筛选具有所需接口的片段:
supportFragmentManager.fragments
.map { it as? ContactsInterface }
.filterNotNull()
.forEach {
it.notifyDenied()
}
或者如果您需要使用Java
:
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for(fragment : fragments) {
if(fragment instanceof ContactsInterface) {
((ContactsInterface)fragment).notifyDenied();
}
}
如果没有找到碎片,您可能还想失败(硬或软)。
这样做的好处是,您不必关心片段的启动方式(手动或布局),也不必关心活动重启时的重新连接。
答案 2 :(得分:0)
此library可能对您有用。
您应该在片段中执行以下操作:
@Override
public void onCreateView() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onDestroyView() {
super.onStop();
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
MessageEvent只是一个例子,你可以使用你想要的任何结构。
在您发布消息的活动中:
EventBus.getDefault()。post(new MessageEvent());
检查库的文档以获得更好的想法并使用更好的方法处理您的案例。
您可以使用onCreate()和onDestroy()代替。这取决于您的逻辑,当您从活动中收到新消息时,您正在更新片段的视图。
快乐的编码:)。