片段已经激活 - 尝试setArguments时

Goo*_*ofy 15 android fragment android-fragments android-listfragment

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

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
} 
Run Code Online (Sandbox Code Playgroud)

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

Bundle b = getArguments();
b.getSerializable(BUNDLE_KEY);
Run Code Online (Sandbox Code Playgroud)

现在选择项目时,它表示"片段已经处于活动状态".

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

Ble*_*ehi 18

另一种解决方案是为片段创建一个空构造函数.

public Detailfragment() {
    super();
    // Just to be an empty Bundle. You can use this later with getArguments().set...
    setArguments(new Bundle());
}
Run Code Online (Sandbox Code Playgroud)

并在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
} 
Run Code Online (Sandbox Code Playgroud)

现在,您可以在setUpLayout()方法中调用getArguments()方法.


Tom*_*sti 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 */
} 
Run Code Online (Sandbox Code Playgroud)

在你的片段类中

public void setUIArguments(Bundle args) {
    getActivity().runOnUiThread(new Runnable() {
        public void run() {
            /* do your UI stuffs */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Squ*_*mon 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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