Android - ListFragment,空包,

时间:2016-05-09 14:04:45

标签: android android-fragments fragment bundle android-listfragment

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

有什么想法吗?

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);

        }

MenuActivity

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();
        }

MenuActivity Layout

<?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> 

1 个答案:

答案 0 :(得分:1)

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

只需删除if (bd1 != null),您就应该好了。