1

1 つのアクティビティと 3 つのフラグメントを持つアプリがあります。

アクティビティには、ログメッセージを保存するアダプターがあります-

MainActivity.java (アダプタを文字列で保持):

private ArrayAdapter<String> mLogListAdapter;

public void onCreate(Bundle savedInstanceState) {
     .....
    mLogListAdapter = new ArrayAdapter<String>(this,
                      android.R.layout.simple_list_item_1,
                      android.R.id.text1);

    if (savedInstanceState == null) {
        MainFragment fragment = new MainFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable("LOG", (Serializable) mLogListAdapter);
        //bundle.putParcellable("LOG", (Parcellable) mLogListAdapter);
        getFragmentManager().beginTransaction()
            .replace(R.id.root, fragment, "main")
            .commit();
    }
}

そして、最初のフラグメントでそのアダプターを使用したいと思います-

MainFragment.java (ログ文字列のリストを表示する必要があります):

private ListView mLogList;

public View onCreateView(LayoutInflater inflater, 
        ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_main, container, false);
    .........       
    mLogList = (ListView) view.findViewById(R.id.logList);
    mLogList.setChoiceMode(ListView.CHOICE_MODE_NONE);

    // THIS DOES NOT WORK
    ListAdapter adapter = 
        (ListAdapter) savedInstanceState.getSerializable("LOG");
    mLogList.setAdapter(adapter);

    return view;
}

残念ながら、これは機能しません (アプリがクラッシュします)。

Fragment に public メソッドを追加して Activity で呼び出すことも試みましたが、mLogListnull になり、NPE を取得します (mLogListコンストラクターではなくonCreateViewメソッドで後で作成されるため):

MainActivity.java:

    if (savedInstanceState == null) {
        MainFragment fragment = new MainFragment();
        fragment.setAdapter(mLogListAdapter);
        getFragmentManager().beginTransaction()
            .replace(R.id.root, fragment, "main")
            .commit();
    }

MainFragment.java:

    public void setAdapter(ListAdapter adapter) {
        mLogList.setAdapter(adapter); // GIVES NPE
    }

私のアダプターをフラグメントに渡す方法を教えてください。

アップデート:

Exception Lover の提案を試してみましたが (+1 に感謝)、次のエラーが発生します。

Bundle 型のメソッド putParcelableArrayList(String, ArrayList) は引数 (String, ArrayAdapter) には適用できません

そして、どのクイックフィックスの提案を採用すればよいかわかりません。

エクリプスのスクリーンショット

また、なぜ使用できないのだろうか- Activity から Fragment にデータを渡すときにsavedInstanceState新しいオブジェクトを作成する必要があるのだろうか?Bundle

4

1 に答える 1

1

MainActivity.java (アダプタを文字列で保持) 変更コード

private ArrayAdapter<String> mLogListAdapter;

public void onCreate(Bundle savedInstanceState) {
     .....
    mLogListAdapter = new ArrayAdapter<String>(this,
                      android.R.layout.simple_list_item_1,
                      android.R.id.text1);

    if (savedInstanceState == null) {
        MainFragment fragment = new MainFragment();
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("arraylist", data);
        fragment.setArguments(bundle);
        getFragmentManager().beginTransaction()
            .replace(R.id.root, fragment, "main")
            .commit();
    }
}

また、変更

public View onCreateView(LayoutInflater inflater, 
        ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_main, container, false);
    .........        
    mLogList = (ListView) view.findViewById(R.id.logList);
Bundle extras = getArguments();
if (extras != null) {
    data = extras.getParcelableArrayList("arraylist");
    mLogList.setAdapter(new MyAdapter(getActivity(), data));
}
    mLogList.setChoiceMode(ListView.CHOICE_MODE_NONE);


    return view;
} 
于 2015-04-14T16:41:55.557 に答える