2017-04-04 4 views
0

をトリガしません。私は私のブレークポイントによるとSupportMapFragmentManagersはgetMapAsync()onMapReady(Googleマップマップ)

onViewCreated()が呼び出されますが、onMapReadyは()(トリガされません this.googleMap = mapにブレークポイント)と呼ばれていません

public abstract class MyMapFragment implements OnMapReadyCallback 
{ 
    // 
    public GoogleMap googleMap; 
    SupportMapFragment mapFragment; 

    @IdRes 
    public abstract int getSupportMapFragId(); 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // http://stackoverflow.com/a/36592000/5102206 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ 
     // Do something for lollipop and above versions 
     mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(getSupportMapFragId()); 
    } else { 
     // do something for phones running an SDK before lollipop 
     mapFragment = (SupportMapFragment) getFragmentManager().findFragmentById(getSupportMapFragId()); 
    } 
    mapFragment.getMapAsync(this); 

    } 

    //.. 

    @Override 
    public void onMapReady(GoogleMap map) { 
    this.googleMap = map; 
    } 
} 

を持っています

Android 5,6,7では、それまでのところうまく動作し、地図を見ることができます。 Android 4.X(API 16 - API 19)デバイスでは、自分のアプリが起動しますが、そこにはフリーズしているようです...白い空白の画面が表示されます。

Android 4.X OSデバイスの場合: 1. getFragmentManager()を使用すると、mapFragmentオブジェクトはelse条件の後でnullになります。 2. getChildFragmentMenager()を使用すると、mapfragmentは有効でnull以外のように見えますが、onMapReadyはトリガーされません。

私はここで何が欠けていますか?

+0

なぜ 'SupportMapFragment'を拡張したり、直接使用したりしませんか? Android Jelly(API 16)以降では、Google Playでサポートされている端末の95.2%をカバーしています。 –

+0

@ JPVentura私はそれを一時的にしましたが、それは何も変わりませんでした。私は同じ結果を持っていた。 –

+0

1.なぜあなたは 'SupportMapFragment'を' MyMapFragment'の中に入れ子にしていますか? 2.誰も使用していないAPIレベルを明示的にチェックしているのはなぜですか? –

答えて

1

メインスレッドのRxJavaからのブロックスレッドに問題がありました。 Googleマップの問題ではありませんでした。

0

フラグメントを入れ子にしている理由はわかりません。具体的には、performance issuesが原因です。

あなたはGoogle Samplesで見てみる場合は、Google Maps例がActivitySupportMapFragmentを使用しています:

public class MapsActivityCurrentPlace extends AppCompatActivity 
      implements OnMapReadyCallback, ConnectionCallbacks, 
      OnConnectionFailedListener { 

    @Override 
    public void onMapReady(GoogleMap map) { 
     mMap = map; 

     // Use a custom info window adapter to handle multiple lines of text in the 
     // info window contents. 
     mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { 

      @Override 
      // Return null here, so that getInfoContents() is called next. 
      public View getInfoWindow(Marker arg0) { 
       return null; 
      } 

      @Override 
      public View getInfoContents(Marker marker) { 
       // Inflate the layouts for the info window, title and snippet. 
       View infoWindow = getLayoutInflater().inflate(R.layout.custom_info_contents, 
         (FrameLayout)findViewById(R.id.map), false); 

       TextView title = ((TextView) infoWindow.findViewById(R.id.title)); 
       title.setText(marker.getTitle()); 

       TextView snippet = ((TextView) infoWindow.findViewById(R.id.snippet)); 
       snippet.setText(marker.getSnippet()); 

       return infoWindow; 
      } 
     }); 

     // Turn on the My Location layer and the related control on the map. 
     updateLocationUI(); 

     // Get the current location of the device and set the position of the map. 
     getDeviceLocation(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (savedInstanceState != null) { 
      mLastKnownLocation = savedInstanceState.getParcelable(KEY_LOCATION); 
      mCameraPosition = savedInstanceState.getParcelable(KEY_CAMERA_POSITION); 
     } 

     setContentView(R.layout.activity_maps); 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this /* FragmentActivity */, 
        this /* OnConnectionFailedListener */) 
      .addConnectionCallbacks(this) 
      .addApi(LocationServices.API) 
      .addApi(Places.GEO_DATA_API) 
      .addApi(Places.PLACE_DETECTION_API) 
      .build(); 

     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     SupportMapFragment mapFragment = 
      (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult result) { 
     Log.d(TAG, result.getErrorMessage()); 
    } 

    @Override 
    public void onConnectionSuspended(int cause) { 
     Log.d(TAG, "Play services connection suspended"); 
    } 

} 
0

注:そのレイアウトが含まれている場合あなたは、フラグメントにレイアウトを膨らませることはできません。あなたがXMLでそれを行うか、またはこのようなJavaコードでそれを行うことができますいずれかの断片でマップを膨張させるようにしたい場合は、動的に

フラグメントに添加したときにネストされた断片のみがサポートされています。

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    FragmentManager fm = getChildFragmentManager(); 
    SupportMapFragment mapFragment = (SupportMapFragment) fm.findFragmentByTag("mapFragment"); 
    if (mapFragment == null) { 
     mapFragment = new SupportMapFragment(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.add(R.id.mapFragmentContainer, mapFragment, "mapFragment"); 
     ft.commit(); 
     fm.executePendingTransactions(); 
    } 
    mapFragment.getMapAsync(callback); 
} 

また、単純なコンテナ

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/mapFragmentContainer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
</LinearLayout> 

また、クラス定義でonMapReadyCallbackを実装する必要はありません。代わりにコールバックのあなたはすぐそこに)新しいOnMapReadyCallbackを(作成:

MapView.getMapAsync(new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(GoogleMap mMap) { 
      googleMap = mMap; 
       } 
      }); 

をあなたはまた、私は、これは何とか役に立てば幸いこれら

MapView mMapView; 
private GoogleMap googleMap; 

を必要とします!

関連する問題