我正在使用以下链接中的示例给出
http://android-er.blogspot.in/2013/04/handle-onlistitemclick-of-listfragment.html
这里我有两个类,一个扩展List Fragment,另一个扩展Fragment。 现在我以这种方式将对象传递给detailfragment:
来自ListFragment * 的 *
现在我收到它的 Fragment 类,基本目标是根据列表片段中选择的项更新片段的UI,这就是我发送对象的原因 现在,在选择的项目上,它显示“片段已经处于活动状态”。 这是什么问题?我做错了什么?@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID);
Bundle bundle = new Bundle();
bundle.putSerializable(BUNDLE_KEY, obj);// passing this object
detailFragment.setArguments(bundle);
detailFragment.setUpLayout();// update the UI
}
Bundle b = getArguments();
b.getSerializable(BUNDLE_KEY);
答案 0 :(得分:18)
另一种解决方案是为片段创建一个空构造函数。
public Detailfragment() {
super();
// Just to be an empty Bundle. You can use this later with getArguments().set...
setArguments(new Bundle());
}
并在onListItemClick方法中使用该包:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID);
// Update the keys.
detailFragment.getArguments().putSerializable(BUNDLE_KEY, obj);// passing this object
detailFragment.setUpLayout();// update the UI
}
现在你可以在你的setUpLayout()方法中调用getArguments()方法。
答案 1 :(得分:12)
来自官方Android开发参考:
public void setArguments(Bundle args)提供此片段的构造参数。这只能在片段附加到其活动之前调用;也就是说,你应该在构造片段后立即调用它。这里提供的参数将在片段销毁和创建中保留。
您的片段已附加到其活动 我建议你使用自己的方法,你不需要setArguments!
在fragment类中创建自己的setUIArguments(Bundle args)并更新此方法中的片段UI
您将以这种方式调用此方法:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID);
Bundle bundle = new Bundle();
bundle.putSerializable(BUNDLE_KEY, obj);// passing this object
detailFragment.setUIArguments(bundle); /* your new method */
}
片段类
public void setUIArguments(Bundle args) {
getActivity().runOnUiThread(new Runnable() {
public void run() {
/* do your UI stuffs */
}
}
}
答案 2 :(得分:12)
您可以检查是否已有参数,如果是,只需添加/更新它们。
private static void initFrag(Fragment frag, Bundle args) {
if (frag.getArguments() == null) {
frag.setArguments(args);
} else {
//Consider explicitly clearing arguments here
frag.getArguments().putAll(args);
}
}
如果您不能安全地假设预先存在的参数仍然有效,您可能希望清除现有参数。
答案 3 :(得分:0)
这是一个全局变量:
private FragmentManager fragmentmanager;
private FragmentTransaction fragmenttransaction;
这些代码放在你的“List Fragment”onCreate()Activity:
中fragmenttransaction = fragmentmanager.beginTransaction();
fragmenttransaction.replace(detailFragmentID, detailFragment, "test");
fragmenttransaction.addToBackStack(null);
fragmenttransaction.commit();
这些是Drawerlistitem点击事件:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Bundle bundle = new Bundle();
fragmenttransaction = fragmentmanager.beginTransaction();
if(fragmentmanager.findFragmentById("test") != null) {
fragmenttransaction.remove(fragmentmanager.findFragmentByTag("test"));
}
Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID);
bundle.putSerializable(BUNDLE_KEY, obj);// passing this object
detailFragment.setArguments(bundle);
fragmenttransaction.replace(detailFragmentID, detailFragment, "test");
fragmenttransaction.addToBackStack(null);
fragmenttransaction.commit();
}
现在按原样扩展片段代码:
Bundle b = getArguments();
b.getSerializable(BUNDLE_KEY);
答案 4 :(得分:0)
对话片段的公共方法
public void setBundle(final Bundle bundle) {
final Bundle arguments = getArguments();
arguments.clear();
arguments.putAll(bundle);
}
显示或更新对话片段
public void showMessageDialogue(final String tag, final Bundle bundle) {
final Fragment fragment = mFragmentManager.findFragmentByTag(tag);
if (fragment != null && fragment instanceof MessageDialogueFragment) {
((MessageDialogueFragment) fragment).setBundle(bundle);
} else {
final MessageDialogueFragment messageDialogueFragment = new MessageDialogueFragment();
messageDialogueFragment.setArguments(bundle);
messageDialogueFragment.show(mFragmentManager, tag);
}
}