Android - ListFragment,空包,

Android - ListFragment, empty bundle,

我试图将参数传递给我的片段 in the way described here. 但是我有一个问题,我每次都得到空包 (null)。 Fragment 首先在 setContentView 中连接,然后使用 newInstance 替换它(那里一切正常,bundle 在 fragment 中创建、添加和返回)。在这两种情况下,在 onCreate 中我都得到空包。在开始创建时它应该是空的,但在用 newInstance 中添加的包替换片段后它不应该。

有什么想法吗?

ListFragment

public class LeftListFragment extends ListFragment {


    private FragmentConnector connector;
    private FragmentConnector.listType type;

    public static final LeftListFragment newInstance(ArrayList<String> values) {
        LeftListFragment llf = new LeftListFragment();

        final Bundle bdl = new Bundle(1);
        bdl.putStringArrayList("values", values);
        llf.setArguments(bdl);

        return llf;
    }

    public void onCreate(Bundle bd1) {
        super.onCreate(bd1);

        if (bd1 != null) {
            List<String> tempList = getArguments().getStringArrayList("values");

            //due to JVM optimizations, using new String[0] is better than new String[list.size()]
            String[] values = tempList.toArray(new String[0]);


            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.rowlayout, R.id.label, values);

            setListAdapter(adapter);

        }

菜单活动

public class MenuActivity  extends Activity implements FragmentConnector {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ArrayList<String> list = new ArrayList<String>();
        list.add("hello");

        setContentView(R.layout.activity_menu);

        if(savedInstanceState == null){
            getFragmentManager()
                    .beginTransaction()
                    .replace(R.id.leftListFragment  ,LeftListFragment.newInstance(list))
                    .addToBackStack(null)
                    .commit();
        }

菜单活动布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

<LinearLayout
    android:baselineAligned="false"
    android:orientation="horizontal"
    tools:context=".Menu.MenuActivity"
    android:layout_height="300dp"
    android:layout_width="fill_parent">

    <fragment
        android:id="@+id/leftListFragment"
        class="com.buczel.attapp.Menu.LeftListFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        tools:layout="@layout/rowlayout">

    </fragment> 

bd1getArguments() 不是一回事。 bd1 实际上是 savedInstanceState。 如果您检查 bd1 != null 那么在您第一次启动 Fragment 时当然没有保存的实例状态。例如,如果设备方向发生变化,那将不为空。 另一方面,getArguments() 仅在第一次启动时设置,当您在构造函数中设置的参数被传递时。

只需删除 if (bd1 != null) 即可。