可以在片段中强制执行 onActivityResult 吗?
It's possible to force onActivityResult in fragment?
我有一个这样的应用程序
在 FragmentB
我有 TextView
和一个 Button
。
该按钮的功能是用新片段 (FragmentB1
) 替换 FragmentB
。在 FragmentB1
中,我显示 ListView
和 Strings
。
在listView的onItemClickListener
中,我必须把return的String
放在FragmentB的TextView
上。问题是我不能使用 Fragment.startActivityForResult()
,因为我只有一个 Activity
(它在屏幕右侧管理交易,还显示 FragmentA
)。是否可以从这个唯一的 Activity
调用 FragmentB 的 onActivityResult
?
注意:我不能在 FragmentB
class 上写方法 setText(String text)
因为我可能会用 FragmentC
或 FragmentD
代替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.
好的,到目前为止我提到的所有内容,这就是您可以做的。
- 从 activity.
加载片段 B
- 当片段 B 的按钮被点击时。调用 activity 的方法,将片段 B 替换为片段 B1。
- 然后B1的onItemClickListener可以调用activity的方法传入String,这样activity就可以用B替换B1,TextView设置为你刚刚传入的String .
如果您不想弄乱界面,您也可以直接对 activity 进行类型转换。例如,如果 activity 是 MainActivity,
((MainActivity) getActivity()).[any public method]
从其片段之一调用时也是可能的。
我有一个这样的应用程序
在 FragmentB
我有 TextView
和一个 Button
。
该按钮的功能是用新片段 (FragmentB1
) 替换 FragmentB
。在 FragmentB1
中,我显示 ListView
和 Strings
。
在listView的onItemClickListener
中,我必须把return的String
放在FragmentB的TextView
上。问题是我不能使用 Fragment.startActivityForResult()
,因为我只有一个 Activity
(它在屏幕右侧管理交易,还显示 FragmentA
)。是否可以从这个唯一的 Activity
调用 FragmentB 的 onActivityResult
?
注意:我不能在 FragmentB
class 上写方法 setText(String text)
因为我可能会用 FragmentC
或 FragmentD
代替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 来引用父 activitypublic 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.
好的,到目前为止我提到的所有内容,这就是您可以做的。
- 从 activity. 加载片段 B
- 当片段 B 的按钮被点击时。调用 activity 的方法,将片段 B 替换为片段 B1。
- 然后B1的onItemClickListener可以调用activity的方法传入String,这样activity就可以用B替换B1,TextView设置为你刚刚传入的String .
如果您不想弄乱界面,您也可以直接对 activity 进行类型转换。例如,如果 activity 是 MainActivity,
((MainActivity) getActivity()).[any public method]
从其片段之一调用时也是可能的。