Как изменить положение кнопки "мое местоположение" в Google Maps с помощью Android studio
Я работаю над картами google, и мне нужно изменить положение моего местоположения (кнопка текущего местоположения). В настоящее время кнопка текущего местоположения находится в правом верхнем углу. Поэтому, пожалуйста, помогите мне, как переустановить кнопку текущего местоположения на экране Google maps. Спасибо заранее.
мой пример кода:
final GoogleMap googleMap = mMapView.getMap();
googleMap.setMyLocationEnabled(true);
9 ответов
вы можете использовать этот
View locationButton = ((View) mMapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
// position on right bottom
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
rlp.setMargins(0, 180, 180, 0);
Я решил эту проблему в моем фрагменте карты, переместив мою кнопку местоположения в правый нижний угол зрения, используя код ниже, вот мой MapsActivity.java: -
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
View mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_map);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapView = mapFragment.getView();
mapFragment.getMapAsync(this);
}
/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera. In this case,
* we just add a marker near Sydney, Australia.
* If Google Play services is not installed on the device, the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
*/
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setMyLocationEnabled(true);
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
if (mapView != null &&
mapView.findViewById(Integer.parseInt("1")) != null) {
// Get the button view
View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
// and next place it, on bottom right (as Google Maps app)
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
locationButton.getLayoutParams();
// position on right bottom
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
layoutParams.setMargins(0, 0, 30, 30);
}
}
}
а вот макет фрагмента :-
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.infogird.www.location_button_reposition.MapFragment">
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</FrameLayout>
Я надеюсь, это решит вашу проблему. Спасибо.
вы можете использовать ниже код для всех такие условия, как: 1.Если вы хотите показать место в верхнем правом 2.Если вы хотите показать место в нижнем углу 3.Если вы хотите показать кнопку местоположения в левом нижнем углу
1.Если вы хотите, чтобы показать кнопку местоположение в правом верхнем углу
View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
// position on right bottom
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
2.Если вы хотите показать кнопку местоположения в правом нижнем углу
View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
// position on right bottom
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);rlp.setMargins(0,0,30,30);
3.Если вы хотите показать кнопку местоположения в левом нижнем углу
View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
// position on right bottom
rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
rlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0);
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
rlp.addRule(RelativeLayout.ALIGN_PARENT_END, 0);
rlp.addRule(RelativeLayout.ALIGN_END, 0);
rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
rlp.setMargins(30, 0, 0, 40);
удачи
установив заполнение на фрагмент GoogleMap, вы можете изменить положение myLocationButton но только проблема в том, что он также изменит положение других кнопок, таких как zoom .
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
@Override
public void onMapReady(GoogleMap map) {
map.setPadding(left, top, right, bottom);
}
его работа отображает кнопку моего местоположения в правом нижнем углу на MapView
XML
<com.google.android.gms.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
JAVA
private MapView mMapView;
mMapView = (MapView) findViewById(R.id.mapView);
mMapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(final GoogleMap mMap) {
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
mMap.setMyLocationEnabled(true);
}
if (mMapView != null && mMapView.findViewById(Integer.parseInt("1")) != null) {
View locationButton = ((View) mMapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
layoutParams.setMargins(0, 0, 20, 20);
}
}
});
Kotlin версия принятого ответа (для нижнего правого) (потому что autoconvert терпит неудачу с этим кодом)
val locationButton= (mapView.findViewById<View>(Integer.parseInt("1")).parent as View).findViewById<View>(Integer.parseInt("2"))
val rlp=locationButton.layoutParams as (RelativeLayout.LayoutParams)
// position on right bottom
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP,0)
rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE)
rlp.setMargins(0,0,30,30);
вы можете сделать одну вещь. Вы отключаете кнопку "мое местоположение" по умолчанию и делаете пользовательскую кнопку в позиции вашего желания, и по щелчку этой кнопки вы перемещаете camara в текущий latlng.
к сожалению, вы можете установить только заполнение, например:
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.setPadding(left, top, right, bottom);
...
}
Я закончил тем, что создал свой собственный и вставил его в макет кадра с помощью layout_gravity
чтобы указать, где я хочу его, в этом случае bottom / end:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="300dp">
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
.../>
<ImageView
android:id="@+id/myLocationCustomButton"
android:layout_width="@dimen/custom_my_location_button_size"
android:layout_height="@dimen/custom_my_location_button_size"
android:layout_gravity="bottom|end"
android:background="@drawable/disc"
android:backgroundTint="@android:color/white"
android:padding="@dimen/margin_smallest"
android:src="@drawable/ic_my_location"
../>
</FrameLayout>
затем, в деятельности, я инициализировал и запустил клиент Google api, который я могу использовать для получения текущего местоположения, когда это необходимо кнопкой во время щелчка, см. кнопку Click listener ниже:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
...
if (googleApiClient == null) {
googleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
myLocationButton = rootView.findViewById(R.id.myLocationCustomButton);
}
@Override
protected void onStart() {
googleApiClient.connect();
super.onStart();
}
@Override
protected void onStop() {
googleApiClient.disconnect();
super.onStop();
}
@Override
public void onConnected(@Nullable Bundle bundle) {
myLocationButton.performClick();
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onMapReady(final GoogleMap googleMap) {
this.googleMap = googleMap;
myLocationButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 16);
MainActivity.this.googleMap.animateCamera(cameraUpdate, 250, null);
}
});
мое приложение суб-модуль в build.gradle
также имеет:
ext {
playServicesVersion = "8.4.0"
}
dependencies {
...
compile "com.google.android.gms:play-services-location:${playServicesVersion}"
...
}
надеюсь, это поможет.
Я знаю, что на него ответили и приняли, но эти ответы не сработали для меня. Возможно, в релятивистской системе произошли изменения.LayoutParams или даже в GoogleMaps, так как на него ответили.
в моих попытках с существующими ответами я понял, что может быть больше правил LayoutParam для кнопки компаса, которые переопределяют мои попытки переместить кнопку компаса, где я хотел. Я экспериментировал, удаляя несколько парамов следующим образом:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
locationButton.getLayoutParams();
layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_TOP);
layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_START);
layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_END);
и затем добавьте новые правила, как они сделали в нескольких ответах. Но все равно получилось не так, как ожидалось. Чаще всего кнопка оставалась где-то с левой стороны.
я решил просто создать новые LayoutParams и заменить существующие и ... это сработало идеально!
первоначально я использовал тег view для GoogleMapCompass
, но вопрос касался GoogleMapMyLocationButton
. Поэтому я прокомментировал GoogleMapCompass
и в GoogleMapMyLocationButton
линии.
вот код для MapFragment.java:
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
public class MapFragment extends Fragment implements OnMapReadyCallback {
private static final String TAG = MapFragment.class.getSimpleName();
private SupportMapFragment mapFragment = null;
public MapFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_map, container, false);
Log.d(TAG, "onCreateView()");
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
mapFragment.setRetainInstance(true);
mapFragment.getMapAsync(this);
return view.findViewById(R.id.map);
}
@Override
public void onMapReady(GoogleMap googleMap) {
Log.d(TAG, "onMapReady()");
View mapView = mapFragment.getView();
moveCompassButton(mapView);
}
/**
* Move the compass button to the right side, centered vertically.
*/
public void moveCompassButton(View mapView) {
try {
assert mapView != null; // skip this if the mapView has not been set yet
Log.d(TAG, "moveCompassButton()");
// View view = mapView.findViewWithTag("GoogleMapCompass");
View view = mapView.findViewWithTag("GoogleMapMyLocationButton");
// move the compass button to the right side, centered
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
layoutParams.addRule(RelativeLayout.CENTER_VERTICAL);
layoutParams.setMarginEnd(18);
view.setLayoutParams(layoutParams);
} catch (Exception ex) {
Log.e(TAG, "moveCompassButton() - failed: " + ex.getLocalizedMessage());
ex.printStackTrace();
}
}
}