¿Cómo obtener la ubicación actual dentro del fragmento de Android?

Un fragmento es una parte de una actividad que permite un diseño de actividad más modular. Un fragmento encapsula la funcionalidad para que sea más fácil de reutilizar en actividades y diseños. Los dispositivos Android existen en una variedad de tamaños de pantalla y densidades. Los fragmentos simplifican la reutilización de componentes en diferentes diseños y su lógica. Puede crear diseños de un solo panel para dispositivos (teléfonos) y diseños de varios paneles para tabletas. También puede usar fragmentos para admitir diferentes diseños para orientación horizontal y vertical en un teléfono inteligente. La siguiente imagen muestra cómo se pueden combinar dos módulos de interfaz de usuario definidos por fragmentos en una actividad para un diseño de tableta, pero separados para un diseño de teléfono.

Fragments in Android

En este artículo vamos a implementar una aplicación en la que podemos obtener las coordenadas de nuestra ubicación actual. Veremos que quién podemos obtener esa ubicación actual en Fragmento .

¿Qué vamos a construir en este artículo?

Aquí hay un video de muestra de lo que vamos a construir en este artículo. Tenga en cuenta que vamos a implementar este proyecto utilizando el lenguaje Java.

Implementación paso a paso

Paso 1. Crear un nuevo proyecto

  • Abra un nuevo proyecto.
  • Estaremos trabajando en Actividad vacía con lenguaje como Java. Deje todas las demás opciones sin cambios.
  • Asigne un nombre a la aplicación a su conveniencia.
  • Habrá dos archivos predeterminados llamados activity_main.xml y MainActivity.java.

Si no sabe cómo crear un nuevo proyecto en Android Studio, puede consultar ¿Cómo crear/iniciar un nuevo proyecto en Android Studio?  

Paso 2. Agregar la dependencia requerida

Vaya a Gradle Scripts > gradle.scripts(módulo) y agréguele la siguiente dependencia

implementation 'com.google.android.gms:play-services-location:17.0.0'

Paso 3. Agregar los permisos requeridos

Navegue hasta el archivo AndroidManifest.xml y agréguele el siguiente fragmento de código:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Paso 4. Trabajando en archivos XML

Vaya a la aplicación > res > diseño > actividad_principal.xml y agregue el siguiente código a ese archivo. A continuación se muestra el código para el archivo activity_main.xml.

XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
  
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/frame_layout"/>
  
</androidx.constraintlayout.widget.ConstraintLayout>

Navegue a la aplicación> haga clic con el botón derecho> nuevo> fragmento> fragmento en blanco y asígnele el nombre MainFragment. Use el siguiente código en el archivo fargment_main.xml:

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp"
    android:layout_height="match_parent"
    tools:context=".MainFragment">
  
   <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:id="@+id/bt_location"
       android:text="Get Location"/>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Latitude"
        android:textSize="32sp"
        android:textStyle="bold"
        android:textColor="@color/teal_200"
        android:layout_marginTop="16dp"/>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_latitude"
        android:text="0.0"
        android:textSize="24sp"/>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Longitude"
        android:textSize="32sp"
        android:textStyle="bold"
        android:textColor="@color/teal_200"
        android:layout_marginTop="16dp"/>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_longitude"
        android:text="0.0"
        android:textSize="24sp"/>
  
</LinearLayout>

Paso 5. Trabajando en archivos Java

Navegue hasta el archivo MainActivity.java y use el siguiente código en él. Se agregan comentarios al código para tener una mejor comprensión.

Java

package com.example.currentloactioninfragment;
  
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
  
import android.os.Bundle;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // Initialize fragment
        Fragment fragment= new MainFragment();
  
        // open fragment
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.frame_layout,fragment)
                .commit();
    }
}

Navegue hasta el archivo MainFragment.java y use el siguiente código en él. Se agregan comentarios al código para tener una mejor comprensión.

Java

package com.example.currentloactioninfragment;
  
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Looper;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.core.content.PackageManagerCompat;
import androidx.fragment.app.Fragment;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
  
public class MainFragment extends Fragment {
  
    // Initialize variables
    Button btLocation;
    TextView tvLatitude, tvLongitude;
    FusedLocationProviderClient client;
  
    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState)
    {
        // Initialize view
        View view = inflater.inflate(R.layout.fragment_main,
                                     container, false);
  
        // Assign variable
        btLocation = view.findViewById(R.id.bt_location);
        tvLatitude = view.findViewById(R.id.tv_latitude);
        tvLongitude = view.findViewById(R.id.tv_longitude);
  
        // Initialize location client
        client = LocationServices
                     .getFusedLocationProviderClient(
                         getActivity());
  
        btLocation.setOnClickListener(
            new View.OnClickListener() {
                @Override public void onClick(View view)
                {
                    // check condition
                    if (ContextCompat.checkSelfPermission(
                            getActivity(),
                            Manifest.permission
                                .ACCESS_FINE_LOCATION)
                            == PackageManager
                                   .PERMISSION_GRANTED
                        && ContextCompat.checkSelfPermission(
                               getActivity(),
                               Manifest.permission
                                   .ACCESS_COARSE_LOCATION)
                               == PackageManager
                                      .PERMISSION_GRANTED) {
                        // When permission is granted
                        // Call method
                        getCurrentLocation();
                    }
                    else {
                        // When permission is not granted
                        // Call method
                        requestPermissions(
                            new String[] {
                                Manifest.permission
                                    .ACCESS_FINE_LOCATION,
                                Manifest.permission
                                    .ACCESS_COARSE_LOCATION },
                            100);
                    }
                }
            });
  
        // Return view
        return view;
    }
  
    @Override
    public void onRequestPermissionsResult(
        int requestCode, @NonNull String[] permissions,
        @NonNull int[] grantResults)
    {
        super.onRequestPermissionsResult(
            requestCode, permissions, grantResults);
        // Check condition
        if (requestCode == 100 && (grantResults.length > 0)
            && (grantResults[0] + grantResults[1]
                == PackageManager.PERMISSION_GRANTED)) {
            // When permission are granted
            // Call  method
            getCurrentLocation();
        }
        else {
            // When permission are denied
            // Display toast
            Toast
                .makeText(getActivity(),
                          "Permission denied",
                          Toast.LENGTH_SHORT)
                .show();
        }
    }
  
    @SuppressLint("MissingPermission")
    private void getCurrentLocation()
    {
        // Initialize Location manager
        LocationManager locationManager
            = (LocationManager)getActivity()
                  .getSystemService(
                      Context.LOCATION_SERVICE);
        // Check condition
        if (locationManager.isProviderEnabled(
                LocationManager.GPS_PROVIDER)
            || locationManager.isProviderEnabled(
                LocationManager.NETWORK_PROVIDER)) {
            // When location service is enabled
            // Get last location
            client.getLastLocation().addOnCompleteListener(
                new OnCompleteListener<Location>() {
                    @Override
                    public void onComplete(
                        @NonNull Task<Location> task)
                    {
  
                        // Initialize location
                        Location location
                            = task.getResult();
                        // Check condition
                        if (location != null) {
                            // When location result is not
                            // null set latitude
                            tvLatitude.setText(
                                String.valueOf(
                                    location
                                        .getLatitude()));
                            // set longitude
                            tvLongitude.setText(
                                String.valueOf(
                                    location
                                        .getLongitude()));
                        }
                        else {
                            // When location result is null
                            // initialize location request
                            LocationRequest locationRequest
                                = new LocationRequest()
                                      .setPriority(
                                          LocationRequest
                                              .PRIORITY_HIGH_ACCURACY)
                                      .setInterval(10000)
                                      .setFastestInterval(
                                          1000)
                                      .setNumUpdates(1);
  
                            // Initialize location call back
                            LocationCallback
                                locationCallback
                                = new LocationCallback() {
                                      @Override
                                      public void
                                      onLocationResult(
                                          LocationResult
                                              locationResult)
                                      {
                                          // Initialize
                                          // location
                                          Location location1
                                              = locationResult
                                                    .getLastLocation();
                                          // Set latitude
                                          tvLatitude.setText(
                                              String.valueOf(
                                                  location1
                                                      .getLatitude()));
                                          // Set longitude
                                          tvLongitude.setText(
                                              String.valueOf(
                                                  location1
                                                      .getLongitude()));
                                      }
                                  };
  
                            // Request location updates
                            client.requestLocationUpdates(
                                locationRequest,
                                locationCallback,
                                Looper.myLooper());
                        }
                    }
                });
        }
        else {
            // When location service is not enabled
            // open location setting
            startActivity(
                new Intent(
                    Settings
                        .ACTION_LOCATION_SOURCE_SETTINGS)
                    .setFlags(
                        Intent.FLAG_ACTIVITY_NEW_TASK));
        }
    }
}

Aquí está el resultado final de nuestra aplicación.

Producción:

Publicación traducida automáticamente

Artículo escrito por jangirkaran17 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *