5

のマップの実装にほとんど問題はありませんfragment。以下は私のコードです。

import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.tfick.android.R;

public class PoiFragment extends Fragment{

private GoogleMap mGoogleMap;

private static final LatLng SYDNEY = new LatLng(23.03,72.62);

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View v=inflater.inflate(R.layout.poi_fragment, container,false);


    MapFragment  mMapFragment = MapFragment.newInstance();
     FragmentTransaction fragmentTransaction =
             getFragmentManager().beginTransaction();
     fragmentTransaction.add(R.id.container1, mMapFragment);
     fragmentTransaction.commit();

     if(mGoogleMap ==null){

            /*initializing map */

            mGoogleMap=mMapFragment.getMap();

            /*cretaing custom camera position*/

            CameraPosition mCameraPosition=new CameraPosition.Builder().target(SYDNEY).bearing(0).tilt(30).build();

            /*setting custom camera position*/

            mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(mCameraPosition));

            /*adding custom marker on the map.*/
             mGoogleMap.addMarker(new MarkerOptions().draggable(true).position(new LatLng(22.03, 72.56)).title("hello world").snippet("Ahmedabad").icon(BitmapDescriptorFactory.fromResource(R.drawable.wifi)));

            mGoogleMap.addMarker(new MarkerOptions().draggable(true).position(new LatLng(23.03, 78.10)).title("hello world").snippet("Baroda").icon(BitmapDescriptorFactory.fromResource(R.drawable.wifi)));

        }

        if(mGoogleMap !=null){


            /* map is already initialized then setting map type */
            /*
             * normal 
             * satellite
             * hybrid
             * terrain
             * none
             */
            mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

        }

    return v;
}
}
03-01 12:15:31.439: E/AndroidRuntime(9299): FATAL EXCEPTION: main
03-01 12:15:31.439: E/AndroidRuntime(9299): java.lang.RuntimeException: Unable to start activity    ComponentInfo{com.tfick.android/com.tfick.android.PointOfIntrest}: java.lang.NullPointerException: CameraUpdateFactory is not initialized
03-01 12:15:31.439: E/AndroidRuntime(9299):     at    android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.app.ActivityThread.access$600(ActivityThread.java:140)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.os.Looper.loop(Looper.java:137)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at  android.app.ActivityThread.main(ActivityThread.java:4898)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at java.lang.reflect.Method.invokeNative(Native Method)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at java.lang.reflect.Method.invoke(Method.java:511)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at dalvik.system.NativeStart.main(Native Method)
03-01 12:15:31.439: E/AndroidRuntime(9299): Caused by: java.lang.NullPointerException: CameraUpdateFactory is not initialized
03-01 12:15:31.439: E/AndroidRuntime(9299):     at com.google.android.gms.internal.at.a(Unknown Source)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at com.google.android.gms.maps.CameraUpdateFactory.J(Unknown Source)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at com.google.android.gms.maps.CameraUpdateFactory.newCameraPosition(Unknown Source)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at com.tfick.fragment.PoiFragment.onCreateView(PoiFragment.java:51)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.app.BackStackRecord.run(BackStackRecord.java:635)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.app.Activity.performStart(Activity.java:5215)
03-01 12:15:31.439: E/AndroidRuntime(9299):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073)
03-01 12:15:31.439: E/AndroidRuntime(9299):     ... 11 more
4

5 に答える 5

1

私のおかげで、次のコードを使用して同じ問題が発生した場合の解決策を見つけました。

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.tfick.android.R;

public class PoiFragment extends MapFragment {
    /*object of google map*/
    public GoogleMap mGoogleMap;
    /* summy location*/
    private static final LatLng SYDNEY = new LatLng(23.03, 72.62);


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        if (getMap() != null) {
            Log.d(getClass().getSimpleName(), "Map ready for use!");

            mGoogleMap = getMap();

            /* cretaing custom camera position */

            CameraPosition mCameraPosition = new CameraPosition.Builder()
                    .target(SYDNEY).bearing(0).tilt(30).build();
            Log.i("gmap", mGoogleMap.toString());

            /* setting custom camera position */

            mGoogleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(mCameraPosition));

            /* adding custom marker on the map. */
            mGoogleMap
                    .addMarker(new MarkerOptions()
                            .draggable(true)
                            .position(new LatLng(22.03, 72.56))
                            .title("hello world")
                            .snippet("Ahmedabad")
                            .icon(BitmapDescriptorFactory
                                    .fromResource(R.drawable.wifi)));

            mGoogleMap
                    .addMarker(new MarkerOptions()
                            .draggable(true)
                            .position(new LatLng(23.03, 78.10))
                            .title("hello world")
                            .snippet("Baroda")
                            .icon(BitmapDescriptorFactory
                                    .fromResource(R.drawable.wifi)));

        }

    }

}
于 2013-03-01T12:48:56.387 に答える
0

問題は、初期化が必要なため、例外がgetMap()返され、例外がスローされることです。nullCameraUpdateFactoryGoogleMap

MapFragmentの内部を使用するときに同様の問題が発生しましたFragment。マップの初期化をに移動することで解決しましたOnResume

于 2013-03-01T11:23:48.210 に答える
0

私はまったく同じ問題に直面しました。このエラーは、getMap()が返されたときに発生しますnull

私は次のことをしました:

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
googleMap = mapFragment.getMap();

/* if googleMap == null then there may be following problem :
 * 1. google play service version are not matching on both device and installed apk.Will show update message on map.
 * 2. No google play service installed. Will show a install message on map.
 */
if (googleMap != null) {
    LatLng iniLoc = new LatLng(44.97651081283853, -93.2245754142059);
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(iniLoc));
    googleMap.getUiSettings().setZoomGesturesEnabled(false);
    currentMarkerOption = new MarkerOptions();
    currentMarkerOption.position(iniLoc);
    currentMarker = googleMap.addMarker(currentMarkerOption);
    currentMarker.setIcon((BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
    currentMarker.setTitle("Current Position");
    currentMarker.showInfoWindow();
    currentMarker.setVisible(false);
    initDestinationMarker();
}
于 2014-01-21T22:27:48.740 に答える
0

Google マップの実装は、いくつかのライフサイクル メソッド (onCreate、onCreateView、onDestroy、onResume、および onPause) に大きく依存しています。独自のフラグメント内にカプセル化する場合は、これらの呼び出しを MapFragment にリレーする必要があります。mapView.getMap() を呼び出して GoogleMap を取得した後、マップは既に初期化されているはずです。

getMap() から null を取得した場合、いくつかのことが起こった可能性があります。

  • MapFragment で onCreate や onCreateView を呼び出さなかった (これらのメソッドの後に getMap() を呼び出す)
  • マニフェストに OpenGL ES 2 機能のエントリがありません
  • マップに必要な権限がありません
  • Google Play SDK サービスがデバイスにインストールされていないか、古すぎます

ここ StackOverflow で initialize(this) ソリューションについてよく読んでいますが、ほとんどの場合、実際には必要ありません。

編集: トランザクションを通じて Mapfragment を追加していることを確認しました。PoiFragment 内で代わりに MapView のみを使用することを検討しましたか? MapFragment を使用してトランザクションを介して追加すると、タイミングの問題が発生すると思います。PoiFragment.onCreateView メソッドを使用している間は、おそらくトランザクションは終了していません (したがって、Maps はまだ初期化されていません)。onResume を使用することもできますが、onResume がより頻繁に呼び出されるため、マップ コードを 1 回だけ初期化する必要があります。

アーキテクチャに関する私の提案:

  • 可能であれば、アクティビティ内で MapFragment を直接使用します
  • そこに入れるのに十分なコードがある場合は、Mapfragment を拡張します。
于 2013-04-26T14:34:42.947 に答える
0

CameraUpdateFactory を初期化します。
ドキュメントに従って - initialize(Context)
を 呼び出します。GooglePlayServicesNotAvailableExceptionがスローされない限り、このクラスは正しく初期化されます。

リンク -
http://developer.android.com/reference/com/google/android/gms/maps/MapsInitializer.html#initialize(android.content.Context)
初期化方法 -

try {
     MapsInitializer.initialize(this /*the context*/);
 } catch (GooglePlayServicesNotAvailableException e) {
     e.printStackTrace();
 }

リファレンス - api v2 の mapview と cameraupdate

于 2013-03-01T07:34:48.833 に答える