我在一个Android应用程序中有两个片段。
这是片段A:
public class AlertsAgentDialogFragment extends DialogFragment {
...
...
OnDataPass dataPasser;
public interface OnDataPass{
public void onDataPass(String data);
}
...
}
public class AgentClickListener implements View.OnFocusChangeListener {
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) {
AlertsAgentDialogFragment dialog = AlertsAgentDialogFragment.newInstance(listValueSet_Agent);
dialog.show(getActivity().getFragmentManager(),"");
}
}
}
这是片段B
public class AlertsDialogFragment extends DialogFragment implements AlertsAgentDialogFragment.OnDataPass {
...
...
public AlertsDialogFragment() {
mContext = getActivity();
}
...
...
@Override
public void onDataPass(String data) {
// TODO Auto-generated method stub
AlertsAgentDialogFragment transaction1 = ((AlertsAgentDialogFragment) getFragmentManager().findFragmentByTag("ItemRoleList"));
transaction1.dataPasser.onDataPass(data);
}
...
}
在片段A中,用户可以从RecycleListView中选择一个项目,我希望当用户选择一个List项时,片段B可以读取此选择。
如何更改代码才能执行此操作?
问候
答案 0 :(得分:2)
基本思想是您不必直接将数据从一个片段传递到另一个片段。
As the documentation says,您必须将数据从一个Fragment传递给Activity,然后Activity将这些数据传递给另一个Fragment。
这是通过以下三个步骤实现的:
所以,我假设你有一个Activity
,其中包含片段A和片段B.想法是在片段A中创建接口,就像你一样,然后你的Activity
必须实现该接口:
public class MyActivity extends Activity implements AlertsAgentDialogFragment.OnDataPass {
@Override
public void onDataPass(String data) {
FragmentB fragment = (FragmentB)getFragmentManager().findFragmentByTag(FragmentB.FRAGMENT_TAG);
if(fragment!=null)
fragment.setYourString(data);
}
}
FragmentB包含表示TAG的常量String
public static final String FRAGMENT_TAG = "fragment_b_tag";
要将该标记与FragmentB相关联,当您显示该片段时,需要执行以下代码:
fragment.show(getFragmentManager(), FragmentB.FRAGMENT_TAG);
你的FragmentB还需要实现一个方法(我称之为setYourString())来管理FragmentA传递的数据。
之后你就完成了:管理传递数据的所有逻辑都在setYourString()方法中。
答案 1 :(得分:1)
答案 2 :(得分:0)
两个片段之间的通信应始终通过活动进行。
创建一个接口并在Activity中提供它的实现,然后当用户在Fragment A中选择一个项目时,使用Activity中的项目调用接口的方法,然后从Activity将该项目发送到片段B。
像这样......
public class FragmentB extends Fragment{
public void getItemFromFragA(String item){
// your code
}
}
public class FragmentA extends Fragment{
ItemClicked mItemClicked;
public interface ItemClicked{
public void sendItem(String item);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mItemClicked = (ItemClicked) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString());
}
}
public void someMethod(){
mItemClicked.sendItem("Item or Object");
}
@Override
public void onDetach() {
mItemClicked = null
super.onDetach();
}
}
public class MainActivity implements FragmentA.ItemClicked{
@Override
public void sendItem(String item){
FragmentB fragmentB = (FragmentB)
getSupportFragmentManager().findFragmentById(R.id.your_fragment_B);
fragmentB.getItemFromFragA(item);
}
}
查看此链接以获取信息......
https://developer.android.com/training/basics/fragments/communicating.html#DefineInterface
答案 3 :(得分:0)
碎片基本上是从活动中控制的。 如果你已经在FragmentA中保存了活动的上下文,你可以从FragmentA调用该活动的方法,然后调用FragmentB的方法。
((YourActivity)context).listItemClicked(arg1,arg2,arg3);
然后在你的活动中
public void listItemClicked(arg1,arg2,arg3){
fragmentB.listItemClicked(arg1,arg2,arg3);
}
但是你需要确保fragmentB被初始化而不是null。