1. ホーム
  2. java

[解決済み] Androidです。フラグメントにデータ(extras)を渡す

2023-06-05 09:14:16

質問

Androidプログラミングの初心者ですが、ParcelableのArrayListをフラグメントに渡す際に問題が発生しました。 これは、起動されたアクティビティです(うまく動作しています!)。 フィードリスト はパーセラブルのArrayListです。 音楽 .

Intent in = new Intent(context, ListMusicsActivity.class);

in.putExtra("arrayMusic", feedList);
activity.startActivity(in);

フラグメントアクティビティonCreate()メソッドです。

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activitymusiclist);

    if(savedInstanceState != null)
    {
        ListMusicFragment frag = new ListMusicFragment();
        frag.setArguments(getIntent().getExtras());
    }
}

Fragmentのコードです。

public class ListMusicFragment extends SherlockFragment{

private ArrayList<Music> listMusics = new ArrayList<Music>();
private ListView listMusic;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState)
{
    listMusics = (ArrayList<Music>) getArguments().getSerializable("arrayMusic");
    View view = inflater.inflate(R.layout.musiclistview, container, false);
    listMusic = (ListView) view.findViewById(R.id.musicListView);
    listMusic.setAdapter(new MusicBaseAdapter(getActivity(), listMusics));

    return view;
}
}

の行に問題があると思います。

listMusics = (ArrayList<Music>) getArguments().getSerializable("arrayMusic");

最後に私の音楽の授業です。

public class Music implements Parcelable{

private String url;
private String artist;
private String title;
private String duration;
private String info_url;
private String lyrics;


public Music(String url, String artist, String title, 
    String duration, String lyrics, String info_url)
{
    this.url = url;
    this.artist = artist;
    this.title = title;
    this.duration = duration;
    this.lyrics = lyrics;
    this.info_url = info_url;
}

public Music(Parcel in)
{
    url = ParcelUtils.readString(in);
    artist = ParcelUtils.readString(in);
    title = ParcelUtils.readString(in);
    duration = ParcelUtils.readString(in);
    info_url = ParcelUtils.readString(in);
    lyrics = ParcelUtils.readString(in);
}

public String getUrl()
{
    return url;
}

public String getArtist()
{
    return artist;
}

public String getTitle()
{
    return title;
}

public String getDuration()
{
    return duration;
}

public String getLyrics()
{
    return lyrics;
}

public String getInfo()
{
    return info_url;
}

@Override
public int describeContents() {
    return 0;
}


@Override
public void writeToParcel(Parcel dest, int flags)
{
    ParcelUtils.writeString(dest, url);
    ParcelUtils.writeString(dest, artist);
    ParcelUtils.writeString(dest, title);
    ParcelUtils.writeString(dest, duration);
    ParcelUtils.writeString(dest, lyrics);
    ParcelUtils.writeString(dest, info_url);
}

public static final Parcelable.Creator<Music> CREATOR = 
    new Parcelable.Creator<Music>() {

    public Music createFromParcel(Parcel in)
    {
        return new Music(in);
    }

    public Music[] newArray(int size)
    {
        return new Music[size];
    }
};
}

このコードを実行すると、問題は java.lang.NullPointerException がフラグメントの onCreateView() メソッドで発生します。 . 私は、私が失敗している場所を見るために正しい方向に誰かが私を指摘した場合、私は非常に感謝します。

EDIT : 問題は解決しました。私はちょうどこの行をフラグメントアクティビティonCreate()メソッドに追加する必要がありました(さもなければ、getArguments()はnullを返すでしょう)。

getSupportFragmentManager().beginTransaction()
    .add(android.R.id.content, frag).commit();

そして、フラグメントコードにこれを追加します。

@Override
    public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);

    Bundle bundle = getArguments();
    if(bundle != null)
    {
        listMusics = bundle.getParcelableArrayList("arrayMusic");
        listMusic.setAdapter(new MusicBaseAdapter(getActivity(), listMusics));
    }
}

ここで、listMusics は ArrayListParcelable 音楽です。

どのように解決するのですか?

2つのことがあります。まず、フラグメントに渡したいデータを正しく追加できていないと思います。フラグメントに渡す必要があるのはバンドルであり、インテントではありません。例えば、私が int の値をフラグメントに送りたい場合、バンドルを作成し、そのバンドルに int をそのバンドルに入れ、そのバンドルをフラグメント作成時の引数として設定します。

Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);

次に、その情報を取得するために、フラグメントに送られた引数を取得する必要があります。そして、識別したキーに基づいた値を抽出します。例えばあなたのフラグメントでは

Bundle bundle = this.getArguments();
if (bundle != null) {
    int i = bundle.getInt(key, defaulValue);
}

何を入れるかによって、得られるものが変わってきます。また、デフォルト値は通常 null ですが、そうである必要はありません。その引数にデフォルト値を設定するかどうかで変わってきます。

最後に私は、これを onCreateView . このデータを取得するには、フラグメントの onActivityCreated メソッド内で取得する必要があると思います。私の理由は以下の通りです。 onActivityCreated は、基礎となるアクティビティが自身の onCreate メソッドを実行します。取得したい情報をバンドル内に配置する場合、アクティビティの onCreate メソッドでバンドル内に配置した場合、フラグメントの onCreateView . これを onActivityCreated を更新して ListView の内容を後で更新するだけです。