質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

6158閲覧

AndroidでのfindFragmentByIdでのnullについて

nappannda

総合スコア7

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2015/12/02 06:41

現在Fragmentの中でGoogleMapを取得しようとしていて
onResumeの中で

lang

1if (mMap == null) { 2 // Try to obtain the map from the SupportMapFragment. 3 SupportMapFragment smp = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.frag_map); 4 mMap = smp.getMap(); 5}

を書いて実行するとSupportMapFragmentがnullになってしまいます。
mMapは上で private GoogleMap mMap;として定義しています。

fragmentのxmlはこのようになっています。

lang

1<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:id="@+id/linear" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:orientation="vertical"> 7 8 <fragment xmlns:android="http://schemas.android.com/apk/res/android" 9 android:id="@+id/frag_map" 10 android:name="com.google.android.gms.maps.MapFragment" 11 android:layout_width="match_parent" 12 android:layout_height="0dp" 13 android:layout_weight="2" 14 tools:context="develop.android.coopi.home.fragment.MapsFragment"/> 15 16 <LinearLayout 17 android:layout_width="match_parent" 18 android:layout_height="0dp" 19 android:layout_weight="1" 20 android:orientation="horizontal"> 21 22 23 <LinearLayout 24 android:layout_width="0dp" 25 android:layout_height="match_parent" 26 android:layout_weight="1" 27 android:gravity="center" 28 android:orientation="horizontal"> 29 30 <TextView 31 android:id="@+id/textview" 32 android:layout_width="wrap_content" 33 android:layout_height="wrap_content" 34 android:text="GPS" 35 android:textSize="20sp" /> 36 37 <ToggleButton 38 android:id="@+id/gps_toggle" 39 android:layout_width="wrap_content" 40 android:layout_height="wrap_content" 41 android:text="New ToggleButton" /> 42 </LinearLayout> 43 44 </LinearLayout> 45 46</LinearLayout> 47

Mapを表示しようとしているFragment名はMapsFragmentでFragmentを配置しようとしているActivity上のソースは下のようになっています。

lang

1FragmentManager fragmentManager = getSupportFragmentManager(); 2FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 3MapsFragment map_fragment = new MapsFragment(); 4fragmentTransaction.add(R.id.fragment_container, map_fragment); 5fragmentTransaction.commit();

findFragmentByIdでのnullが起こらないようにするにはどうしたらいいでしょうか?

わかりにくい質問になってしまいすみませんが、どうかご回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

getChildFragmentManagerではなくgetFragmentManagerを使うとどうでしょうか?

投稿2015/12/02 08:40

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nappannda

2015/12/02 08:45

getFragmentManagerも試したのですが結局nullが帰ってきてしまいます。
yona

2015/12/02 08:50

引数をR.id.fragment_containerにしてみたらどうでしょうか。
nappannda

2015/12/02 08:59

getChildFragmentManager().findFragmentById(R.id.frag_map);のR.id.frag_mapをfragment.containerにするということでしょうか? fragment.containerはFrameLayoutなのでMapFragmentが取れないと思うのですが…
yona

2015/12/02 09:10

findFragmentByIdのリファレンスをみてください。 引数に渡すのはコンテナのidと書いてあります。
nappannda

2015/12/02 09:29

getFragmentManager.findFragmentById(R.id.fragment_container)とするとClassCastExceptionと言われてしまいました。 getChildFragmentManager.findFragmentById(R.id.fragment_container)だとnullが返ってくるだけです。 Activityで管理しているFragmentのxmlの中に定義されているcom.google.android.gms.maps.MapFragmentを取得してそれをgetMap()してmMapの中に入れたいのですがどうすればいいでしょうか?
yona

2015/12/02 09:36

「◯◯という例外が起きました」じゃ分かりません。その後に続く情報をコメントに含めるべきだと思います。 今回は「MapsFragmentはSupportMapFragmentにキャスト出来ません」と言われていませんか?
nappannda

2015/12/02 09:45

すみません。これからエラー情報などを載せるようにします。 getFragmentManagerの方のエラーです。キャストができずに失敗しています。 java.lang.RuntimeException: Unable to resume activity {develop.android.coopi.home/develop.android.coopi.home.MapsActivity}: java.lang.ClassCastException: develop.android.coopi.home.fragment.MapsFragment cannot be cast to com.google.android.gms.maps.SupportMapFragment at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2836) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2865) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2291) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:212) at android.app.ActivityThread.main(ActivityThread.java:5137) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ClassCastException: develop.android.coopi.home.fragment.MapsFragment cannot be cast to com.google.android.gms.maps.SupportMapFragment at develop.android.coopi.home.fragment.MapsFragment.setUpMapIfNeeded(MapsFragment.java:68) at develop.android.coopi.home.fragment.MapsFragment.onResume(MapsFragment.java:61) at android.support.v4.app.Fragment.performResume(Fragment.java:2005) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230) at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:2052) at android.support.v4.app.FragmentController.dispatchResume(FragmentController.java:187) at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:462) at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:451) at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:141) at android.app.Activity.performResume(Activity.java:5323) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2826)             at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2865)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2291)             at android.app.ActivityThread.access$800(ActivityThread.java:144)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:212)             at android.app.ActivityThread.main(ActivityThread.java:5137)             at java.lang.reflect.Method.invokeNative(Native Method)             at java.lang.reflect.Method.invoke(Method.java:515)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)             at dalvik.system.NativeStart.main(Native Method) getChildFragmentの方は何もエラーが起きずnullが返ってくるだけです。
yona

2015/12/02 09:49

今回はgetChildFragmentは関係ありません。 なぜ、MapsFragmentをSupportMapFragmentにキャストしているんですか?
nappannda

2015/12/02 09:57

すべてのFragmentでsupport.v4.appを利用しているからです。
yona

2015/12/02 10:10

例外の意味を理解していますか? あなたはMapsFragmentを継承関係のない全く異なるクラスである、SupportMapFragmentにキャストしていますよ。そのため例外が発生しています。
yona

2015/12/02 10:37

クラスの関係がわかりました。 ・Fragmentのname属性がリンク先と違います。 ・getChildFragmentを使ってください。
nappannda

2015/12/03 03:27

返信が大変遅くなり申し訳ございません。 Fragmentのname属性はandroid:name="com.google.android.gms.maps.SupportMapFragment"でいいのでしょうか? SupportMapFragment smp = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.fragment_container); をやってみたのですがsmpにはnullが入ってきます。どこを直せばいいのでしょうか?
yona

2015/12/03 03:31

findFragmentByIdの引数をR.id.fragment_containerからR.id.frag_mapに変更してみてください。
nappannda

2015/12/03 03:47

無事GoogleMapが取得できました。 何回も自分の拙い返信にご回答ありがとうございました。
yona

2015/12/03 06:03

ズバッと回答できずにもうしわけないです。
nappannda

2015/12/03 06:30

いえいえ自分の説明が悪いのと回答を頂くための情報提供不足のせいです。 少ない情報の中、回答してくださりありがとうございました。 また質問することがあると思うのでその時、時間がありましたらよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問