[解決済み] Androidです。フラグメントにデータ(extras)を渡す
質問
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 は
ArrayList
の
Parcelable
音楽です。
どのように解決するのですか?
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
の内容を後で更新するだけです。
関連
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
セミコロン期待値エラー解決
-
Javaがテキストファイルを読み込む
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] Androidアプリケーションのアクティビティ間でデータを受け渡すにはどうすればよいですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】Androidで、あるアクティビティから別のアクティビティにオブジェクトを渡す方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
セミコロン期待値エラー解決
-
Javaがテキストファイルを読み込む
-
maven レポート エラー 解決不可能な親POM
-
Java基礎編 - オブジェクト指向
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
[解決済み] AndroidフラグメントのgetIntent().getExtras()はどこで、どのように使うのですか?重複