11

マップ フラグメント (API v2) をアプリに追加し、マップが画面全体をカバーし、上部に半透明のアクションバーが表示されます。アクティビティは、android:windowActionBarOverlayが true に設定されたテーマを使用します。

マップで「MyLocationButton」も有効にしましたが、マップが画面の高さ全体をカバーしているため、ボタンがアクション バーで覆われています。

ここに画像の説明を入力

代わりに、マップ フラグメントがアクション バーの下または画面の下部に位置ボタンを描画するようにするにはどうすればよいですか?

4

5 に答える 5

6

独自のボタンを作成する代わりに、アクション バーのサイズに合わせて組み込みボタンを移動するだけです。
このコードは私にとっては機能し、ボタンはボタンのあるべき場所にあります(Googleマップのように):

// Gets the my location button
View myLocationButton = getSherlockActivity().findViewById(R.id.MainContainer).findViewById(2); 

// Checks if we found the my location button        
if (myLocationButton != null){
        int actionBarHeight = 0;
        TypedValue tv = new TypedValue();

           // Checks if the os version has actionbar in it or not
           if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
              if (getSherlockActivity().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
                actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
           }
           // Before the action bar was added to the api
           else if(getSherlockActivity().getTheme().resolveAttribute(com.actionbarsherlock.R.attr.actionBarSize, tv, true)){
                actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
           }

        // Sets the margin of the button
        ViewGroup.MarginLayoutParams marginParams = new ViewGroup.MarginLayoutParams(myLocationButton.getLayoutParams());
        marginParams.setMargins(0, actionBarHeight + 20, 20, 0);
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
        myLocationButton.setLayoutParams(layoutParams);
}


このコードを onActivityCreated に入れるだけです (onCreateOptionsMenu に入れる場合、3.0 より前のバージョンはサポートされません。ライフサイクルが異なるためです。
別のこととして、「R.id.MainContainer」はマップのコンテナーです)フラグメント.

ActionBar Sherlock を使用していますが、いくつかの変更を加えることで通常のアクション バーでも動作します..

于 2013-04-01T08:28:40.983 に答える
3

以下 (特にfixMapControlLocations) では、ActionBarSherlock でこれに対処しました。

私が抱えていた問題は、狭い画面にあり、回転に応じて分割アクション バーのオフセットが正しくありませんでした。シャーロックを介したisNarrowチェックで、狭いかどうかがわかります。

もう 1 つの重要な変更点は、myLocation の親の親ビューのパディングを設定していることです。これにより、内部のすべてのコントロールが取得され、hierarchyviewer に基づいて、Google マップがどのようにそれを行っているかが示されます。Google 帰属ロゴは、Surface オブジェクトのツリーの次の親にあります。簡単に移動できるようには見えないので、コンプライアンスを維持するために、おそらく下部のアクションバーの透明効果を失うことになるでしょう.

protected void onCreate(Bundle savedInstanceState) {
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map);
    setUpMapIfNeeded();

    getSupportActionBar().setBackgroundDrawable(d);
    getSupportActionBar().setSplitBackgroundDrawable(d);
}

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the
    // map.
    if (map == null) {
        // Try to obtain the map from the SupportMapFragment.
        map = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map)).getExtendedMap();

        // Check if we were successful in obtaining the map.
        if (map != null) {
            setUpMap();
        }
    }
}

private void setUpMap() {
    fixMapControlLocations();
    .....
}

private void fixMapControlLocations() {
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
    {
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }

    View myLocationParent = ((View)mapFragment.getView().findViewById(1).getParent());
    View myLocationParentParent = ((View)myLocationParent.getParent());
    myLocationParentParent.setPadding(0, actionBarHeight, 0, isNarrow()?actionBarHeight:0);
}

public boolean isNarrow() {
    return ResourcesCompat.getResources_getBoolean(getApplicationContext(),
            R.bool.abs__split_action_bar_is_narrow);
}
于 2013-06-18T01:25:15.153 に答える
1

これはすでに機能強化として提出されています (まだ行っていない場合はスターを付けてください) http://code.google.com/p/gmaps-api-issues/issues/detail?id=4670

一時的な回避策として、アクションバーの下に独自の場所検索ボタンを追加しました (私のマップ フラグメントは RelativeLayout にあるため、alignParentRight を実行し、適切なマージンを上に設定しました)。

次に、私の onClickHandler でこれを行いました:

public void onClickHandler(View target) {
   switch (target.getId()) {
      case R.id.my_fml_btn:         
         mMap.setMyLocationEnabled(true);
         View fmlBtn = mMapWrapper.findViewById(2); //mMapWrapper is my RelativeLayout
         if (fmlBtn != null) fmlBtn.setVisibility(View.INVISIBLE);
         break;
   }
}

階層ビューアーを使用して、マップ API によって追加されたボタンの ID を見つけました。たまたまマップに追加された (そして非表示に設定された) 2 番目のビューです。

もちろん、LayoutParams をいじって、このボタンを非表示にするのではなくオフセットすることもできますが、このボタンは MyLocationEnabled を true に設定した後にのみ表示されます。(私の使用例では、GPSを起動する前にユーザーに決定させることを好みます)

于 2013-01-17T10:24:49.760 に答える
0

フラグメントのコンテンツを正しくオフセットするために?android:attr/actionBarSize(またはActionBarSherlock を使用している場合は)使用していることを確認してください。?attr/actionBarSize

達成しようとしている効果に応じて、この値をマージンまたはパディングとして適用します。半透明の ActionBar のために、マップをその背後に表示する (そしてシースルー効果を維持する) ために、パディングを試してみることをお勧めします。パディングが実際に「Locate me」ボタンを下に移動するかどうかは100%確信が持てません...そうでない場合は、おそらくマージンを適用することが唯一の選択肢です。

この属性の例と詳細については、こちらを参照してください。

于 2013-01-13T00:41:20.507 に答える