Android - 与主要活动中的活动片段对话

时间:2018-04-10 12:36:38

标签: android

我有一个主要活动,其中有一堆碎片连接到它。

其中一个片段必须能够在中将数据加载到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。

3 个答案:

答案 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()代替。这取决于您的逻辑,当您从活动中收到新消息时,您正在更新片段的视图。

快乐的编码:)。