web-dev-qa-db-ja.com

SupportMapFragmentのfindFragmentByIdは、Android Studioでnullを返します

最近、プロジェクトをEclipseからAndroid Studio。ヌル :(

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    SupportMapFragment m = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.safety_map));

xmlのスニペット...

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
     xmlns:map="http://schemas.Android.com/apk/res-auto"
     Android:layout_width="match_parent"
     Android:layout_height="match_parent"
     Android:orientation="vertical" >

     <fragment
         Android:id="@+id/safety_map"
         Android:layout_width="fill_parent"
         Android:layout_height="fill_parent"
         Android:layout_marginBottom="40dp"
         map:cameraTargetLat="@string/livesafe_latitude"
         map:cameraTargetLng="@string/livesafe_longitude"
         map:uiZoomControls="false"
         class="com.google.Android.gms.maps.SupportMapFragment"/>

Build.gradleの依存関係は次のとおりです。

 dependencies {
    //google analytics
    compile 'com.google.apis:google-api-services-analytics:v3-rev103-1.19.0'
    //support library for api 10
    compile 'com.Android.support:support-v4:21.0.0'
    //google play services
    compile 'com.google.Android.gms:play-services:6.1.11'
    compile project(':facebook')
    compile files('libs/Android-support-multidex.jar')
    compile files('libs/aws-Android-sdk-1.6.0-debug.jar')
    compile files('libs/FlurryAnalytics_3.3.2.jar')
 }

以前にEclipseで機能していたXMLファイルまたはFragmentクラスのコードは変更していません。

37
J_Sizzle

Fragment.onActivityCreated()をオーバーライドしているという事実から判断すると、マップフラグメントを含むレイアウトはFragmentのレイアウトであると思います。その場合、SupportMapFragmentは、ホスティングFragmentの-​​childフラグメントです。取得しようとすると、ActivityFragmentManagerを使用しています。代わりにFragmentFragmentManagerを使用する必要があります。

たとえば、これ:

SupportMapFragment m = ((SupportMapFragment) getActivity()
        .getSupportFragmentManager().findFragmentById(R.id.safety_map));

になる:

SupportMapFragment m = ((SupportMapFragment) getChildFragmentManager()
        .findFragmentById(R.id.safety_map));
167
kcoppock

はい。 Mapフラグメントがフラグメントの内部にある場合、targetSdkVersion 21では機能しません(いくつかの問題により、 this および this に言及しました)。

一時的な解決がそのようなトリックをアドバイスできるので:

public class MyFragment extends Fragment {

    private SupportMapFragment fragment;
    private GoogleMap map;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.layout_with_map, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        FragmentManager fm = getChildFragmentManager();
        fragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container);
        if (fragment == null) {
            fragment = SupportMapFragment.newInstance();
            fm.beginTransaction().replace(R.id.map_container, fragment).commit();
        }
    }
}
17
cosic

すべての答えは、それぞれの方法で正しいです。誰かのJavaのコードをフォローしているのに、XMLコードの実装がそれらとは異なるため、あなたのために働いていない場合があります。

ActivityFragmentの両方でどのようにマップをロードしたかについて、私の意見を述べましょう。

アクティビティ:

 <fragment
    Android:name="com.google.Android.gms.maps.MapFragment"
    Android:id="@+id/map"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"/>

Javaクラス:

MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 

フラグメント内:

<fragment
        Android:name="com.google.Android.gms.maps.SupportMapFragment"
        Android:id="@+id/map"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"/>

Javaクラス:

 SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
3
Parsania Hardik

次のコードは私のために働いた。私はFragmentでGoogleマップを使用していました:

 SupportMapFragment m = ((SupportMapFragment) getChildFragmentManager() .findFragmentById(R.id.safety_map));
3
T. pac