最近、プロジェクトを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クラスのコードは変更していません。
Fragment.onActivityCreated()
をオーバーライドしているという事実から判断すると、マップフラグメントを含むレイアウトはFragment
のレイアウトであると思います。その場合、SupportMapFragment
は、ホスティングFragment
の-childフラグメントです。取得しようとすると、Activity
FragmentManager
を使用しています。代わりにFragment
のFragmentManager
を使用する必要があります。
たとえば、これ:
SupportMapFragment m = ((SupportMapFragment) getActivity()
.getSupportFragmentManager().findFragmentById(R.id.safety_map));
になる:
SupportMapFragment m = ((SupportMapFragment) getChildFragmentManager()
.findFragmentById(R.id.safety_map));
はい。 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();
}
}
}
すべての答えは、それぞれの方法で正しいです。誰かのJavaのコードをフォローしているのに、XMLコードの実装がそれらとは異なるため、あなたのために働いていない場合があります。
Activity
とFragment
の両方でどのようにマップをロードしたかについて、私の意見を述べましょう。
アクティビティ:
<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);
次のコードは私のために働いた。私はFragment
でGoogleマップを使用していました:
SupportMapFragment m = ((SupportMapFragment) getChildFragmentManager() .findFragmentById(R.id.safety_map));