可以在片段中强制onActivityResult吗?

时间:2016-03-01 02:34:46

标签: android android-fragments android-nested-fragment

我有这样的应用程序

enter image description here

FragmentB我有TextView和一个Button。 按钮的功能是将FragmentB替换为新的片段(FragmentB1)。在FragmentB1中,我显示了ListView Strings。 在listView' onItemClickListener中,我必须返回String并将其放在FragmentB' s TextView上。问题是我无法使用Fragment.startActivityForResult()因为我只有一个Activity(它管理屏幕右侧的交易并显示FragmentA)。是否可以从这个独特的onActivityResult调用FragmentB&#39 {s} {/ 1}}?

注意:我无法在Activity课程上撰写setText(String text)方法,因为我可能会FragmentBFragmentC代替FragmentD }

1 个答案:

答案 0 :(得分:0)

丹尼,

处理片段时,片段之间的最佳通信方式是通过活动。例如。让我们考虑具有片段B,C和D的活动A. 将新片段设置为通过FragmentManager放置并加载后,可以调用它上面的getActivity()来获取对它的引用。一个好主意是实现一个接口,以便您可以在任何实现它的活动上使用它并调用回调方法:

// creating the fragment here from the mainActivity  
FragB fragB = new FragB();
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.imager, fragB).commit();


// This is because my example activity implements FragBListener which is defined in the FragB class
@Override
public void onCallFromFragB() {

}

FragB

public class FragB extends Fragment {
private FragBListener activity;

....

   public interface FragBListener{
    void onCallFromFragB();

}
}

现在,您可以通过在onAttach()

上调用getActivity来引用父活动
public void onAttach(Context context) {
    super.onAttach(context);
....

    activity = (FragBListener) getActivity();
}

现在您有对活动的引用,您可以从界面调用实现的方法。你可以真正从父活动中调用任何公共方法,只要你不将它转发给监听器,我只是喜欢它。

现在从活动中调用Fragment内部的方法更加容易。像这样:

FragB fragB= (FragB) getSupportFragmentManager().findFragmentById(R.id.imager);
    if(fragB != null){
        // FragB is in view
        // call it's methods
    }

这样,您的片段将是自包含的,并且通过活动完成通信,因此您不必担心该场景。您只是想确保在片段上调用公共方法,只要它们不为null(在布局中)。

供参考,您可以看到this.

好的,到目前为止我所提到的一切,这是你能做的。

  1. 从活动中加载片段B.
  2. 单击片段B的按钮时。调用活动的方法,将片段B替换为片段B1。
  3. B1的onItemClickListener然后可以调用活动的方法传入String,这样活动可以用B替换B1,TextView设置为刚刚传入的String。
  4. 如果您不想搞乱界面,您也可以只是对活动进行类型转换。例如,如果活动是MainActivity,

    ((MainActivity) getActivity()).[any public method]
    
    从其中一个片段调用时也可以