Search code examples
androidandroid-studiokotlinandroid-linearlayoutandroid-relativelayout

Geolocation button in Kotlin application is unavailable


I'm trying to create a maps application that can take your location and same time save your markers.

But I'm getting trouble try to adding a FloatingButton same time.

This is my content_main.XML with LoactionButton and the .XML of previous is:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.google.android.material.appbar.AppBarLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary">
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_weight="13"
                    android:orientation="horizontal"
                    android:gravity="center_vertical">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/app_name"
                        android:textColor="#FFFFFF"
                        style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"/>
                </RelativeLayout>
            </androidx.appcompat.widget.Toolbar>
    </com.google.android.material.appbar.AppBarLayout>
</LinearLayout>

I've been replace the LinearLayout element with RelativeLayout because trying to a FloatingButton in content_main.xml I obtain the next . The .xml image previous is:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.google.android.material.appbar.AppBarLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary">
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_weight="13"
                android:orientation="horizontal"
                android:gravity="center_vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/app_name"
                    android:textColor="#FFFFFF"
                    style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"/>
            </LinearLayout>
        </androidx.appcompat.widget.Toolbar>
    </com.google.android.material.appbar.AppBarLayout>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="10dp"
        android:layout_marginTop="180dp"
        android:backgroundTint="#FFF"
        android:clickable="true"
        android:focusable="true"
        app:fabSize="normal">
    </com.google.android.material.floatingactionbutton.FloatingActionButton>

</LinearLayout>

So searching many examples in google I saw some people use the RelativeLayout to put FloatingButton in main content. I decided to change to put RelativeLayout, but LocationButton is unavailable like this the previous .xml is the next, and is the actual:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.google.android.material.appbar.AppBarLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary">
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_weight="13"
                android:orientation="horizontal"
                android:gravity="center_vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/app_name"
                    android:textColor="#FFFFFF"
                    style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"/>
            </LinearLayout>
        </androidx.appcompat.widget.Toolbar>
    </com.google.android.material.appbar.AppBarLayout>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="10dp"
        android:layout_marginTop="180dp"
        android:backgroundTint="#FFF"
        android:clickable="true"
        android:focusable="true"
        app:fabSize="normal">
    </com.google.android.material.floatingactionbutton.FloatingActionButton>

</RelativeLayout>

I searching many examples and I modified my content_main.xml but I have no solutions to put the location button with FloatingButton.

how can add a FloatingButton with my actual LocationButton?

EDIT: this is my ButtonLocation

 override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap //Princiapal Map Variable
        mMap.setOnMarkerClickListener(this) //Location Marker
        mMap.uiSettings.isZoomControlsEnabled = true //Zoom in maps enabled
        mMap.uiSettings.isMyLocationButtonEnabled = true

        setUpMap() //Function to detect actual location
    }

EDIT IMAGE:

This is my actual Layout mockup with This .xml. But now I have the issue with the Toolbar Widget.


Solution

  • You already have something there. The red floating button is on top of the map, which is what you want. To see Google's location button (normally at top-right corner), you need to issue:

    mMap.setMyLocationEnabled(true);
    mMap.getUiSettings().setMyLocationButtonEnabled(true);
    

    Edit: For kotlin, use the following snippet:

    override fun onMapReady(googleMap: GoogleMap) {
      mMap = googleMap
    
      this.setUpMap()
    }
    
    companion object {
      private const val LOCATION_PERMISSION_REQUEST_CODE = 1
    }
    
    private fun setUpMap() {
    
      if (ActivityCompat.checkSelfPermission(this,
          android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
          arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), LOCATION_PERMISSION_REQUEST_CODE)
        return
      }
    
      mMap.isMyLocationEnabled = true
    }
    
    override fun onRequestPermissionsResult(requestCode: Int,
                                            permissions: Array<String>, grantResults: IntArray) {
      when (requestCode) {
        LOCATION_PERMISSION_REQUEST_CODE -> {
          // If request is cancelled, the result arrays are empty.
          if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
            // permission was granted, yay! Do the task you need to do.
            setUpMap()
          } else {
            // permission denied, boo!
          }
          return
        }
        else -> {
          // Ignore all other requests.
        }
      }
    }