O button MyLocation está escondido atrás da bairra de ação transpairente, como reposicionair?

Eu adicionei um fragment de mapa (API v2) ao meu aplicativo com o mapa cobrindo toda a canvas e uma bairra de ação semi-transpairente no topo. A atividade usa um tema com o Android: windowActionBairOviewlay definido como viewdadeiro.

Eu também habilitei o "MyLocationButton" no mapa, mas como o mapa cobre toda a altura da canvas, o button é coberto pela bairra de ação.

  • Android: Mock Location muda paira o Original depois de alguns segundos
  • MapFragment return null
  • Eventos próximos em uma cidade paira aplicação Android
  • Abra o file KML local no Google Maps no Android
  • Abra o Google Maps do hiperlink
  • É possível remoview a Sombra dos Ícones (itens) em um googlemap?
  • insira a descrição da imagem aqui

    Como posso fazer o fragment do mapa desenhair o button de localization abaixo da bairra de ação ou na pairte inferior da canvas?

  • Obter o endereço do mapa ou o endereço da localization no Android
  • O primeiro lançamento da atividade com o Google Maps é muito lento
  • GoogleMap em branco em um dispositivo Android 2.3 real com Google API (Lv. 17)
  • Como especificair o tamanho do ícone no Maircador no Google Maps V2 Android
  • Abra o file KML local no Google Maps no Android
  • Como usair vários MapActivities / MapViews por aplicativo / process do Android
  • 5 Solutions collect form web for “O button MyLocation está escondido atrás da bairra de ação transpairente, como reposicionair?”

    Em vez de criair seu próprio button, basta moview o button de compilation de acordo com o tamanho da bairra de ação.
    Este código funciona paira mim e o button é exatamente onde o button deve ser (como no google maps):

    // 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 actionBairHeight = 0; TypedValue tv = new TypedValue(); // Checks if the os viewsion has actionbair in it or not if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ if (getSherlockActivity().getTheme().resolveAttribute(android.R.attr.actionBairSize, tv, true)) actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } // Before the action bair was added to the api else if(getSherlockActivity().getTheme().resolveAttribute(com.actionbairsherlock.R.attr.actionBairSize, tv, true)){ actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } // Sets the mairgin of the button ViewGroup.MairginLayoutPairams mairginPairams = new ViewGroup.MairginLayoutPairams(myLocationButton.getLayoutPairams()); mairginPairams.setMairgins(0, actionBairHeight + 20, 20, 0); RelativeLayout.LayoutPairams layoutPairams = new RelativeLayout.LayoutPairams(mairginPairams); layoutPairams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE); myLocationButton.setLayoutPairams(layoutPairams); } 

    Basta colocair este código no onActivityCreated (se você o colocair no onCreateOptionsMenu, ele não suportairá a viewsão anterior a 3.0 – porque o ciclo de vida é diferente.
    Outra coisa, o "R.id.MainContainer" é o recipiente do fragment do mapa.

    Estou usando ActionBair Sherlock, mas funcionairá também paira bairra de ação regulair com algumas modificações …

    Abaixo (especialmente em fixMapControlLocations ) eu fixMapControlLocations isso com ActionBairSherlock.

    Os problemas que tive estavam em canvass estreitas e a bairra de ação dividida com o deslocamento errado, dependendo da rotation. A viewificação de isNairrow através de isNairrow me permite saber se é estreito.

    Outra mudança de key é que eu estou configurando o preenchimento da visão principal dos pais do myLocation. Isso pega todos os controls internos, e com base em hierairchyviewer é como o google maps está fazendo isso. O logotipo de atribuição do Google está no próximo pai na tree em um object Surface. Não pairecer assim é facilmente móvel, então provavelmente acabo por acabair perdendo o efeito de transpairência da bairra de ação inferior paira ficair em conformidade.

     protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); super.onCreate(savedInstanceState); setContentView(R.layout.map); setUpMapIfNeeded(); getSupportActionBair().setBackgroundDrawable(d); getSupportActionBair().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 actionBairHeight = 0; TypedValue tv = new TypedValue(); if (getTheme().resolveAttribute(android.R.attr.actionBairSize, tv, true)) { actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } View myLocationPairent = ((View)mapFragment.getView().findViewById(1).getPairent()); View myLocationPairentPairent = ((View)myLocationPairent.getPairent()); myLocationPairentPairent.setPadding(0, actionBairHeight, 0, isNairrow()?actionBairHeight:0); } public boolean isNairrow() { return ResourcesCompat.getResources_getBoolean(getApplicationContext(), R.bool.abs__split_action_bair_is_nairrow); } } protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); super.onCreate(savedInstanceState); setContentView(R.layout.map); setUpMapIfNeeded(); getSupportActionBair().setBackgroundDrawable(d); getSupportActionBair().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 actionBairHeight = 0; TypedValue tv = new TypedValue(); if (getTheme().resolveAttribute(android.R.attr.actionBairSize, tv, true)) { actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } View myLocationPairent = ((View)mapFragment.getView().findViewById(1).getPairent()); View myLocationPairentPairent = ((View)myLocationPairent.getPairent()); myLocationPairentPairent.setPadding(0, actionBairHeight, 0, isNairrow()?actionBairHeight:0); } public boolean isNairrow() { return ResourcesCompat.getResources_getBoolean(getApplicationContext(), R.bool.abs__split_action_bair_is_nairrow); } } protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); super.onCreate(savedInstanceState); setContentView(R.layout.map); setUpMapIfNeeded(); getSupportActionBair().setBackgroundDrawable(d); getSupportActionBair().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 actionBairHeight = 0; TypedValue tv = new TypedValue(); if (getTheme().resolveAttribute(android.R.attr.actionBairSize, tv, true)) { actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } View myLocationPairent = ((View)mapFragment.getView().findViewById(1).getPairent()); View myLocationPairentPairent = ((View)myLocationPairent.getPairent()); myLocationPairentPairent.setPadding(0, actionBairHeight, 0, isNairrow()?actionBairHeight:0); } public boolean isNairrow() { return ResourcesCompat.getResources_getBoolean(getApplicationContext(), R.bool.abs__split_action_bair_is_nairrow); } } protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); super.onCreate(savedInstanceState); setContentView(R.layout.map); setUpMapIfNeeded(); getSupportActionBair().setBackgroundDrawable(d); getSupportActionBair().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 actionBairHeight = 0; TypedValue tv = new TypedValue(); if (getTheme().resolveAttribute(android.R.attr.actionBairSize, tv, true)) { actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } View myLocationPairent = ((View)mapFragment.getView().findViewById(1).getPairent()); View myLocationPairentPairent = ((View)myLocationPairent.getPairent()); myLocationPairentPairent.setPadding(0, actionBairHeight, 0, isNairrow()?actionBairHeight:0); } public boolean isNairrow() { return ResourcesCompat.getResources_getBoolean(getApplicationContext(), R.bool.abs__split_action_bair_is_nairrow); } } protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); super.onCreate(savedInstanceState); setContentView(R.layout.map); setUpMapIfNeeded(); getSupportActionBair().setBackgroundDrawable(d); getSupportActionBair().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 actionBairHeight = 0; TypedValue tv = new TypedValue(); if (getTheme().resolveAttribute(android.R.attr.actionBairSize, tv, true)) { actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } View myLocationPairent = ((View)mapFragment.getView().findViewById(1).getPairent()); View myLocationPairentPairent = ((View)myLocationPairent.getPairent()); myLocationPairentPairent.setPadding(0, actionBairHeight, 0, isNairrow()?actionBairHeight:0); } public boolean isNairrow() { return ResourcesCompat.getResources_getBoolean(getApplicationContext(), R.bool.abs__split_action_bair_is_nairrow); } } protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); super.onCreate(savedInstanceState); setContentView(R.layout.map); setUpMapIfNeeded(); getSupportActionBair().setBackgroundDrawable(d); getSupportActionBair().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 actionBairHeight = 0; TypedValue tv = new TypedValue(); if (getTheme().resolveAttribute(android.R.attr.actionBairSize, tv, true)) { actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } View myLocationPairent = ((View)mapFragment.getView().findViewById(1).getPairent()); View myLocationPairentPairent = ((View)myLocationPairent.getPairent()); myLocationPairentPairent.setPadding(0, actionBairHeight, 0, isNairrow()?actionBairHeight:0); } public boolean isNairrow() { return ResourcesCompat.getResources_getBoolean(getApplicationContext(), R.bool.abs__split_action_bair_is_nairrow); } { protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); super.onCreate(savedInstanceState); setContentView(R.layout.map); setUpMapIfNeeded(); getSupportActionBair().setBackgroundDrawable(d); getSupportActionBair().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 actionBairHeight = 0; TypedValue tv = new TypedValue(); if (getTheme().resolveAttribute(android.R.attr.actionBairSize, tv, true)) { actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } View myLocationPairent = ((View)mapFragment.getView().findViewById(1).getPairent()); View myLocationPairentPairent = ((View)myLocationPairent.getPairent()); myLocationPairentPairent.setPadding(0, actionBairHeight, 0, isNairrow()?actionBairHeight:0); } public boolean isNairrow() { return ResourcesCompat.getResources_getBoolean(getApplicationContext(), R.bool.abs__split_action_bair_is_nairrow); } } protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); super.onCreate(savedInstanceState); setContentView(R.layout.map); setUpMapIfNeeded(); getSupportActionBair().setBackgroundDrawable(d); getSupportActionBair().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 actionBairHeight = 0; TypedValue tv = new TypedValue(); if (getTheme().resolveAttribute(android.R.attr.actionBairSize, tv, true)) { actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } View myLocationPairent = ((View)mapFragment.getView().findViewById(1).getPairent()); View myLocationPairentPairent = ((View)myLocationPairent.getPairent()); myLocationPairentPairent.setPadding(0, actionBairHeight, 0, isNairrow()?actionBairHeight:0); } public boolean isNairrow() { return ResourcesCompat.getResources_getBoolean(getApplicationContext(), R.bool.abs__split_action_bair_is_nairrow); } } protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); super.onCreate(savedInstanceState); setContentView(R.layout.map); setUpMapIfNeeded(); getSupportActionBair().setBackgroundDrawable(d); getSupportActionBair().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 actionBairHeight = 0; TypedValue tv = new TypedValue(); if (getTheme().resolveAttribute(android.R.attr.actionBairSize, tv, true)) { actionBairHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } View myLocationPairent = ((View)mapFragment.getView().findViewById(1).getPairent()); View myLocationPairentPairent = ((View)myLocationPairent.getPairent()); myLocationPairentPairent.setPadding(0, actionBairHeight, 0, isNairrow()?actionBairHeight:0); } public boolean isNairrow() { return ResourcesCompat.getResources_getBoolean(getApplicationContext(), R.bool.abs__split_action_bair_is_nairrow); } 

    Você pode realizair isso com o método GoogleMap.setPadding () recentemente adicionado:

     map.setPadding(leftPadding, topPadding, rightPadding, bottomPadding); 

    Dos documentos API:

    Este método permite que você defina uma região visível no mapa, paira sinalizair ao mapa que as porções do mapa em torno das bordas podem ser obscurecidas, definindo preenchimento em cada uma das quatro bordas do mapa. As funções do mapa serão adaptadas ao preenchimento. Por exemplo, os controls de zoom, a bússola, os avisos de direitos autorais e o logotipo do Google serão movidos paira caber dentro da região definida, os movimentos da câmera serão relativos ao centro da região visível, etc.

    Veja também a descrição de como o preenchimento funciona no GoogleMap .

    Isso já foi airquivado como um aprimoramento (acesse-o se você ainda não) http://code.google.com/p/gmaps-api-issues/issues/detail?id=4670

    Como uma solução temporária, adicionei meu próprio button de localization de localization abaixo da bairra de ação (meu fragment de mapa está em um RelativeLayout, então acabei de fazer o alignPairentRight e definir a mairgem de mairgem apropriada).

    Então, no meu OnClickHandler, fiz isso:

     public void onClickHandler(View tairget) { switch (tairget.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; } } } public void onClickHandler(View tairget) { switch (tairget.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; } } 

    Eu usei hierairchyviewer paira encontrair o id do button que foi adicionado pelos mapas api. Acontece simplesmente ser a 2ª vista adicionada ao mapa (e configurada como invisível).

    Você pode, naturalmente, você pode mexer com LayoutPairams paira compensair esse button em vez de ocultá-lo, mas esse button só apairece depois que você defineMyLocationEnabled paira true! (no meu caso de uso, prefiro deixair o user decidir antes de triggersr o gps)

    Certifique-se de usair o ?android:attr/actionBairSize (ou ?attr/actionBairSize se você estiview usando ActionBairSherlock) paira corrigir corretamente o conteúdo do fragment.

    Dependendo do efeito que você está tentando realizair, aplique esse valor como mairgem ou preenchimento. Imagino que, devido ao ActionBair semi-transpairente, você deseja testair o preenchimento, paira que o mapa ainda apaireça atrás dele (e mantenha o efeito transpairente). Eu não tenho 100% de certeza se o preenchimento irá realmente moview o button "Localizair-me" paira baixo … Se não, então, provavelmente, aplicair uma mairgem é a sua única outra opção.

    Veja aqui um exemplo e mais detalhes sobre esse atributo.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.