Как получить широту и долготу отдельно в 2 текстовых представлениях в Android studio JAVA?

#java #android #android-studio #geolocation

#java #Android #android-studio #геолокация

Вопрос:

из этого я получаю широту и долготу в одном текстовом представлении. Но я хочу, чтобы широта была в 1 текстовом представлении, а долгота — в другом текстовом представлении. Пожалуйста, помогите мне в этом.

Моя основная деятельность

     package com.shopping.myapplication;

    import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    Button addressButton;
    TextView addressTV;
    TextView latLongTV;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        addressTV = (TextView) findViewById(R.id.addressTV);
       

        addressButton = (Button) findViewById(R.id.addressButton);

        addressButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {

                EditText editText = (EditText) findViewById(R.id.addressET);
                String address = editText.getText().toString();

                GeocodingLocation locationAddress = new GeocodingLocation();
                locationAddress.getAddressFromLocation(address,
                        getApplicationContext(), new GeocoderHandler());
            }
        });

    }

    private class GeocoderHandler extends Handler {
        @Override
        public void handleMessage(Message message) {
            String locationAddress;
            switch (message.what) {
                case 1:
                    Bundle bundle = message.getData();
                    locationAddress = bundle.getString("address");
                    break;
                default:
                    locationAddress = null;
            }
            latLongTV.setText(locationAddress);
        }
    }
    }




 

мое геокодирование class.java

     package com.shopping.myapplication;

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

public class GeocodingLocation {

    private static final String TAG = "GeocodingLocation";

    public static void getAddressFromLocation(final String locationAddress,
                                              final Context context, final Handler handler) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                Geocoder geocoder = new Geocoder(context, Locale.getDefault());
                String result = null;

                try {
                    List
                            addressList = geocoder.getFromLocationName(locationAddress, 1);
                    if (addressList != null amp;amp; addressList.size() > 0) {
                        Address address = (Address) addressList.get(0);
                        StringBuilder sb = new StringBuilder();



                        sb.append(address.getLatitude()).append("n");
                        sb.append(address.getLongitude()).append("n");
                        result = sb.toString();
                    }
                } catch (IOException e) {
                    Log.e(TAG, "Unable to connect to Geocoder", e);
                } finally {
                    Message message = Message.obtain();
                    message.setTarget(handler);
                    if (result != null) {
                        message.what = 1;
                        Bundle bundle = new Bundle();
                        result = "Address: "   locationAddress  
                                "nnLatitude and Longitude :n"   resu<
                        bundle.putString("address", result);
                        message.setData(bundle);
                    } else {
                        message.what = 1;
                        Bundle bundle = new Bundle();
                        result = "Address: "   locationAddress  
                                "n Unable to get Latitude and Longitude for this address location.";
                        bundle.putString("address", result);
                        message.setData(bundle);
                    }
                    message.sendToTarget();
                }
            }
        };
        thread.start();
    }
}


 

из этого я получаю широту и долготу в одном текстовом представлении. Но я хочу, чтобы широта была в 1 текстовом представлении, а долгота — в другом текстовом представлении. Пожалуйста, помогите мне в этом.

Ответ №1:

Пожалуйста, поправьте меня, если я ошибаюсь, но, похоже, вы получаете широту длиной в одну строку для адреса. Внутри run() метода для потока есть следующие строки:

 sb.append(address.getLatitude()).append("n");
sb.append(address.getLongitude()).append("n");
result = sb.toString();
 

Как вы можете видеть, вы можете получить широту и долготу из объекта address напрямую! Есть много способов, которыми вы можете это сделать. При желании вы можете вставить значения lat и long в пакет. Согласно документации, getLatitude() и getLongitude() возвращает double :

 public double getLatitude()
 

Вы могли бы попробовать поместить значения независимо в пакет и дать им соответствующие ключи. Или, если вы не хотите возиться с географическим кодом, вы могли бы в onCreate() методе просто сделать:

 String address = editText.getText().toString();
String[] values = address.split("\n"); //we know that we need to split by \n because we did sb.append(address.getLatitude()).append("n")
//N.b: make sure to include \n double backslash!
String lat = values[0];
String long = values[1];
 

Надеюсь, это поможет! Пожалуйста, дайте мне знать, если это работает: D

РЕДАКТИРОВАТЬ: я попытался реализовать это сам, и, похоже, это работает без проблем! Вот скриншот: введите описание изображения здесь

Вот основная деятельность:

 import androidx.appcompat.app.AppCompatActivity;

import android.location.Address;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    Button addressButton;
    TextView addressTV;
    TextView latTV;
    TextView longTV;
    EditText editText;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        addressTV = findViewById(R.id.addressTV);
        latTV = findViewById(R.id.latTV);
        longTV = findViewById(R.id.longTV);
        addressButton = findViewById(R.id.addressButton);
        editText = (EditText) findViewById(R.id.addressET);

        addressButton.setOnClickListener(arg0 -> {
            String address = editText.getText().toString();

            GeocodingLocation locationAddress = new GeocodingLocation();
            locationAddress.getAddressFromLocation(address,
                    getApplicationContext(), new GeocoderHandler());
        });
    }

    private class GeocoderHandler extends Handler {
        @Override
        public void handleMessage(Message message) {
            switch (message.what) {
                case 1:
                    Bundle bundle = message.getData();
                    Address address = bundle.getParcelable("address");
                    latTV.setText(address.getLatitude() "");
                    longTV.setText(address.getLongitude() "");
                    break;
                case 2:
                    addressTV.setText("unable to get address");
            }

        }
    }
}
 

Примечания: Я упростил некоторые вещи здесь для вас, но это по сути то же самое. Однако важным моментом является то, что вы можете вставлять Parcable объекты непосредственно в пакет, а поскольку Address объекты есть Parcable , вы можете поместить Address объект непосредственно в пакет!

Вот класс местоположения геокодирования:

 import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

public class GeocodingLocation {

    private static final String TAG = "GeocodingLocation";

    public static void getAddressFromLocation(final String locationAddress,
                                              final Context context, final Handler handler) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                Geocoder geocoder = new Geocoder(context, Locale.getDefault());
                Message message = Message.obtain();
                message.setTarget(handler);

                try {
                    List addressList = geocoder.getFromLocationName(locationAddress, 1);
                    if (addressList != null amp;amp; addressList.size() > 0) {
                        Address address = (Address) addressList.get(0);

                        message.what = 1;
                        Bundle bundle = new Bundle();
                        bundle.putParcelable("address", address);
                        message.setData(bundle);
                    }
                } catch (IOException e) {
                    Log.e(TAG, "IOException", e);
                    message.what = 2;
                }
                message.sendToTarget();
            }
        };
        thread.start();
    }
}
 

Примечание: здесь я также немного упростил ваш код. Лично (и я думаю, что большинство людей согласятся), мне нравится кодировать таким образом, чтобы использовать наименьшие отступы, но при этом быть интерпретируемым. Вместо этого try catch finally я просто поместил правильные фрагменты кода в try и catch отдельно, так что больше нет необходимости в finally предложении вообще.

До того, как у вас появилось сообщение со строкой адреса, и в предложении catch вы бы поместили строку «невозможно получить адрес для местоположения» в пакет с ключом «адрес»:

 Bundle bundle = new Bundle();
result = "Address: "   locationAddress  
         "nnLatitude and Longitude :n"   resu<
bundle.putString("address", result);
 

result Строка содержит не адрес, а скорее сообщение об ошибке, поэтому, вероятно, не стоит помещать ее в пакет с ключом «address» (потому что это сообщение об ошибке). Я сделал это немного по-другому, я установил сообщение.какое свойство message.what = 2; , и сделал это case switch внутри основного действия.

Надеюсь, это поможет вам в дальнейшем! : D

Комментарии:

1. Это путаница. Как я могу реализовать это в своем коде? Он выдает ошибки: (

2. Это отвечает на ваш вопрос?

3. Да, чувак, это так. Спасибо за помощь. Теперь все работает нормально 🙂

4. Рад помочь моему другу!