2016-07-17 24 views
3

私はいくつかのマーカーでMapFragmentを表示する小さなAndroidアプリケーションで作業しています。物事は、アプリが起動されてから地図が長すぎるように見えるまでの時間を見つけることです。だから最初にProgressDialogを表示し、レンダリングを開始したらProgressDialogを閉じてマップを表示します。地図が表示されるまでの画面の読み込み

これまで、MapFragmentのインスタンスを作成し、getMapAsyncを呼び出して、onMapReadyコールバックにそのフラグメントを表示しようとしました。

public class MyApp extends FragmentActivity implements OnMapReadyCallback 
{ 

private ProgressDialog mLoading; 
private MapFragment mFragment; 

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

    mFragment = MapFragment.newInstance(); 
    mFragment.getMapAsync(this); 
    // Dosen't work without the line below 
    // getFragmentManager().beginTransaction().replace(android.R.id.content, mFragment).commit(); 

    mLoading = ProgressDialog.show(this, "Chargement", "", true, false); 
} 

@Override 
public void onMapReady(GoogleMap googleMap) 
{ 
    googleMap.setOnMyLocationButtonClickListener(null); 
    googleMap.setMyLocationEnabled(false); 
    googleMap.getUiSettings().setMyLocationButtonEnabled(false); 
    googleMap.getUiSettings().setMapToolbarEnabled(false); 

    // When map renders entirely, dismiss ProgressDialog and display MapFragment 
    mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() 
    { 
     @Override 
     public void onMapLoaded() 
     { 
      mLoading.dismiss(); 
      getFragmentManager().beginTransaction().replace(android.R.id.content, mFragment).commit(); 
     } 
    }); 

    // ... 
} 

私はAndroidの世界に少しの初心者だ:しかし、あなたが私のコードであるonCreate ...

でフラグメントを表示しない場合、それは動作しないようですだから私はあなたの助けが必要です。 私がコードや英語で間違っていると教えてください、私は両方を学んでいます。

答えて

2

実際にonMapReadyコールバックを取得するには、マップを作成する必要があります。今は、MapFragmentオブジェクトを作成していて、何もしません。あなたがあなたの質問に書いたように、あなたが画面にそれを追加するまで、地図の読み込みは始まりません。私はあなたのレイアウトXMLが設定されているかどうかはわかりませんが、私は私のテストでそれをやった方法は、このようなものだった:で

<FrameLayout 
     android:id="@+id/frame_map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clipToPadding="false" /> 

:あなたはフラグメントを表示する場所のための

レイアウトXML onCreate

MapFragment mFragment = MapFragment.newInstance(); 
getFragmentManager().beginTransaction().add(R.id.frame_map, mFragment).commit(); 

FrameLayout fl = new FrameLayout(context); 
fl.setBackgroundColor(Color.WHITE); //change to whatever color your activity/fragment has set as its background color 
fl.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); //cover the whole frame 
final int flid = View.generateViewId(); //generate a new View ID. This requires API 17, so if you're supporting lower than that use just a static integer instead 
fl.setId(flid); 
((FrameLayout) findViewById(R.id.frame_map)).addView(fl); 

次に、あなたのonMapLoadedコールバックで:

((FrameLayout) findViewById(R.id.frame_map)).removeViewInLayout(findViewById(flid)); 

これでフラグメントが始まり、新しい背景のあるFrameLayoutでカバーします(より良い方法があるかもしれませんが、これはすばやく見つかりました)。次に、ロードが完了すると、カバーレイアウトが削除されます。または、ProgressDialogとそれを覆っているので、ロードされている地図を見ることができないことはおそらく重要ではありませんが、それは私の意見です。 Hopfeullyこれは期待どおりに動作します!

編集:最初の回答は機能しませんでした。新しい方法で改訂されました。

+0

私は試みましたが、表示が隠されているとマップが読み込まれないようです。その場合、onMapLoadedコールバックは呼び出されません。 onMapReadyでVewを可視に設定したとしても。 – Zartech

+0

Hm、odd ...私が今日チャンスをつくったとき、私はそれをちょっと混乱させ、私があなたのために何を思いつくのか見てみましょう! – T3KBAU5

+0

私はそれで私のアプリで少し遊んで、私の答えを改訂しました。これは私にとってはうまくいくようでしたが、もしそうなら私に教えてください! – T3KBAU5

関連する問題