15

我正在使用以下链接中的示例

http://android-er.blogspot.in/2013/04/handle-onlistitemclick-of-listfragment.html

在这里,我有两个类,一个扩展 List Fragment,另一个扩展 Fragment。现在我以这种方式将对象传递给 detailfragment:

*来自 ListFragment *

@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
} 

现在在Fragment类中我收到它,基本目标是根据列表片段中选择的项目更新片段的 UI,这就是我发送对象的原因

Bundle b = getArguments();
b.getSerializable(BUNDLE_KEY);

现在在选定的项目上显示“片段已激活”。

这里有什么问题?我究竟做错了什么?

4

5 回答 5

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() 方法。

于 2014-03-28T12:30:36.490 回答
12

来自官方 Android 开发参考:

public void setArguments (Bundle args)提供此片段的构造参数。这只能在片段附加到其活动之前调用;也就是说,您应该在构建片段后立即调用它。此处提供的参数将在片段销毁和创建过程中保留。

您的片段已经附加到它的活动 我建议您使用自己的方法,您不需要 setArguments!

在片段类中创建自己的 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 */
        }
    }
}
于 2013-11-15T10:53:45.077 回答
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);
    }
}

或者,如果您不能安全地假设预先存在的参数仍然有效,您可能希望清除现有参数。

于 2015-09-30T03:19:39.723 回答
0

这是一个全局变量:

private FragmentManager fragmentmanager;
private FragmentTransaction fragmenttransaction;

这些代码放在您的“列表片段” 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);
于 2014-10-10T13:00:36.140 回答
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);
         } 
   }
于 2015-09-21T13:14:05.890 回答