android - 在片段之间传递数组不起作用

时间:2017-08-23 14:45:42

标签: android listview android-fragments arraylist android-arrayadapter

在名为locate_map的片段上,我声明了一个字符串数组并将其转换为String ArrayList。我希望将ArrayList传递给另一个名为locate_updatedstatus的片段。我的locate_map片段上有一个ID为to_update_status的按钮,它会从locate_map切换到locate_updatedstatus,同时会传递我的ArrayList并将其显示为列表视图我的locate_updatedstatus

建筑没有错误。但是,每当我导航到我的locate_updatedstatus应用程序崩溃时。

主要活动。这是我在片段之间切换的方式。我正在使用导航抽屉活动与容器片段

public void onSelectFragment(View v){ 
      Fragment newFragment;

       if(v == findViewById(R.id.to_update_status)){ 
            newFragment = new locate_updatedstatus();
        }
        else{
            newFragment = new locate_login();
        }

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.fragment_container, newFragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }

locate_map片段

public class locate_map extends Fragment implements Serializable{

    public locate_map () {
        // Required empty public constructor

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_locate_map, container, false);

        String[] updatedArr = {"display this", "also this"};
        List<String> stringList = new ArrayList<String>(Arrays.asList(updatedArr));
        Bundle bundle = new Bundle();
        bundle.putSerializable("key", (Serializable) stringList);
        return rootView;
    }

}

locate_map xml按钮

<Button
        android:id="@+id/to_update_status"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/check_images"
        android:layout_marginTop="15dp"
        android:text="Update Status"
        android:width="340dp"
        android:height="70dp"
        android:onClick="onSelectFragment"
        />

locate_updatedstatus片段

public class locate_updatedstatus extends Fragment implements Serializable {


    public locate_updatedstatus() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_locate_updatedstatus, container, false);

        ArrayList<String> stringList = (ArrayList<String>)getArguments().getSerializable("key");


                ListView listSource = (ListView) rootView.findViewById(R.id.updates);

                ArrayAdapter<String> listViewAdapter = new ArrayAdapter<String>(
                        getActivity(),
                        android.R.layout.simple_list_item_1,
                        stringList
                );

                listSource.setAdapter(listViewAdapter);

        return rootView; // Inflate the layout for this fragment
    }

}

locate_updatedstatus xml listview

<ListView
            android:layout_width="match_parent"
            android:layout_height="350dp"
            android:layout_marginTop="60dp"
            android:id="@+id/updates"
            android:listSelector="@android:color/transparent"
             />

如果答案详细,我将不胜感激。我是android编程的初学者,请耐心等待。

logcat错误

 java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.os.Bundle.getSerializable(java.lang.String)' on a null object reference                                                                          at com.example.makati.sidebar.locate_updatedstatus.onCreateView(locate_updatedstatus.java:31)

2 个答案:

答案 0 :(得分:0)

您需要的只是bundle.putStringArray

String[] updatedArr = {"display this", "also this"};
bundle.putStringArray(KEY, updatedArr)

和     bundle.getStringArray(KEY)

在您的代码中,您没有将Bundle作为参数添加到Fragment 请使用link修复类构造函数

答案 1 :(得分:0)

下面的代码只是创建捆绑包并向其添加arraylist。但没有具体说明它将被使用的地方。

List<String> stringList = new ArrayList<String>(Arrays.asList(updatedArr));
    Bundle bundle = new Bundle();
    bundle.putSerializable("key", (Serializable) stringList);

解决方案:希望第一个locate_login和locate_updatedstatus片段按顺序创建。

locate_login片段:尝试放置内容活动意图

List<String> stringList = new ArrayList<String>(Arrays.asList(updatedArr));
Bundle bundle = new Bundle();
bundle.putSerializable("key", (Serializable) stringList);
getActivity().getIntent().putExtras("key",bundle);

locate_upadtestatus片段:从活动意图中获取数据

    ArrayList<String> stringList = (ArrayList<String>)getActivity().getIntent().getExtras("key");