がありActivity
、そこに がありMenuItem
、クリックすると次のものが初期化されますDialogFragment
。
MapDialogFragment df = new MapDialogFragment();
Bundle bundle = new Bundle();
bundle.putDoubleArray("lat_log", new double[] {48.85139, 2.34798});
df.setArguments(bundle);
df.show(fragmentManager, "google_maps_dialog_fragment");
この DialogFragment には、GoogleMaps が含まれ<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
ています。
GoogleMap
オブジェクトには、OnMapClickListener
ユーザーがクリックするとマーカーが追加される があります。すべてうまくいきます。
次に、ユーザーが閉じるボタンをクリックすると、次のコードが実行されます。
getArguments().remove("lat_log");
dismissAllowingStateLoss();
その後Dialog
、 が閉じActivity
られ、ユーザーが ( を介して) 入力したデータでコードが更新されますListener
。
MenuItem
ユーザーがもう一度クリックしてDialog
開くと、ユーザーが以前に挿入したすべてのデータがまだそこにあります。
ダイアログのコードがonCreateView()
メソッドで初期化されました。onResume()
知っておくと役立つ場合は、実装していません...
私は何を間違っていますか?
どうもありがとう、フェリペ
編集1:
I have tried the following before showing the DialogFragment:
Fragment prev = fragmentManager.findFragmentByTag("google_maps_dialog_fragment");
if(prev != null) {
fragmentManager.beginTransaction().remove(prev).commit();
}
MapDialogFragment df = new MapDialogFragment();
Bundle bundle = new Bundle();
bundle.putDoubleArray("lat_log", new double[] {48.85139, 2.34798});
df.setArguments(bundle);
df.show(fragmentManager, "google_maps_dialog_fragment");
うまくいきませんでした...
アイデアのある人はいますか?
編集 2: 問題の原因が見つかりました:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
try {
view = inflater.inflate(R.layout.dialog, container, false);
} catch (InflateException e) {
/* map is already there, just return view as it is */
System.out.println("this is not working");
}
....
何らかのクレイジーな理由で、DialogFragment を 2 回目にインスタンス化すると、inflate メソッドが null を返すため、追加しましたif (view != null)
...理由はわかりません。だから私はview
as クラス変数への参照を保持しています...だから今、インフレが今戻っている理由を見つけなければなりません...
編集4
@Override
public void onDestroyView() {
super.onDestroyView();
MapFragment f = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
if (f != null)
getFragmentManager().beginTransaction().remove(f).commit();
}
ほらね。これはうまくいきます!