#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. Рад помочь моему другу!