可以在片段中强制执行 onActivityResult 吗?

It's possible to force onActivityResult in fragment?

我有一个这样的应用程序

FragmentB 我有 TextView 和一个 Button。 该按钮的功能是用新片段 (FragmentB1) 替换 FragmentB。在 FragmentB1 中,我显示 ListViewStrings。 在listView的onItemClickListener中,我必须把return的String放在FragmentB的TextView上。问题是我不能使用 Fragment.startActivityForResult(),因为我只有一个 Activity(它在屏幕右侧管理交易,还显示 FragmentA)。是否可以从这个唯一的 Activity 调用 FragmentB 的 onActivityResult?

注意:我不能在 FragmentB class 上写方法 setText(String text) 因为我可能会用 FragmentCFragmentD 代替FragmentB

丹妮,

处理片段时,片段之间的最佳通信方式是通过 activity。例如。让我们考虑具有片段 B、C 和 D 的 Activity A。 通过 FragmentManager 设置要放置的新 Fragment 并加载它后,您可以对其调用 getActivity() 以获取对它的引用。一个好主意是实现一个接口,这样你就可以在任何实现它的 activity 上使用它并调用回调方法:

// 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() {

}

片段B

public class FragB extends Fragment {
private FragBListener activity;

....

   public interface FragBListener{
    void onCallFromFragB();

}
}

现在您可以通过在 onAttach()

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

    activity = (FragBListener) getActivity();
}

现在您已经有了对 activity 的引用,您可以从接口调用已实现的方法。你真的可以从父 activity 调用任何 public 方法,只要你不将它强制转换为侦听器,我只是喜欢那样。

现在从 activity 调用片段内部的方法更加容易。像这样:

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

这样你的片段将是自包含的,并且通信是通过 activity 完成的,所以你真的不必担心这种情况。您只想确保在片段上调用 ​​public 方法,只要它们不为空(在布局中)即可。

参考可以看this.

好的,到目前为止我提到的所有内容,这就是您可以做的。

  1. 从 activity.
  2. 加载片段 B
  3. 当片段 B 的按钮被点击时。调用 activity 的方法,将片段 B 替换为片段 B1。
  4. 然后B1的onItemClickListener可以调用activity的方法传入String,这样activity就可以用B替换B1,TextView设置为你刚刚传入的String .

如果您不想弄乱界面,您也可以直接对 activity 进行类型转换。例如,如果 activity 是 MainActivity,

((MainActivity) getActivity()).[any public method]

从其片段之一调用时也是可能的。