#java #android #xml
#java #Android #xml
Вопрос:
Я хочу добавить карты Google, и пользователь сможет видеть свое местоположение и ближайших ветеринаров. Но когда я запускаю код, у меня есть «android.view.InflateException: строка двоичного XML-файла # 11: строка двоичного XML-файла # 11: Ошибка раздувания фрагмента класса» ошибка. Как я могу это исправить??
Я добавил действие с картой в свое приложение. Операция выполнена успешно. Но он не показывает местоположение, которое я хочу видеть. Например, когда я выбираю больницу, ничего не меняется. Что не так в моем коде?
моя MapActivity:
public class MapActivitiy extends AppCompatActivity {
//views
Spinner spType;
Button btFind;
SupportMapFragment supportMapFragment;
GoogleMap map;
FusedLocationProviderClient fusedLocationProviderClient;
double currentLat = 0, currentLong = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_activitiy);
//init views
spType = findViewById(R.id.sp_type);
btFind = findViewById(R.id.findBtn);
supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.google_map);
//yer çeşitlerinin arrayi
final String[] placeTypeList = {"hospital", "vet", "atm"};
//yer isimlerinin arrayi
String[] placeNameList = {"Hospital", "Vet", "ATM"};
//spinner'a adapteri ayarla
spType.setAdapter(new ArrayAdapter<>(MapActivitiy.this, R.layout.support_simple_spinner_dropdown_item, placeNameList));
//fused location provider client
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
//izinleri kontrol et
if (ActivityCompat.checkSelfPermission(MapActivitiy.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//izin verildiğinde, methodu çağır
getCurrentLocation();
}
else {
//izinler alınmadıysa, izin iste
ActivityCompat.requestPermissions(MapActivitiy.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},44);
}
btFind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Spinner'de seçilen pozisyonu al
int i = spType.getSelectedItemPosition();
//url
String url = "https://maps.google.com/maps/api/place/nearbysearch/json?" //url
"location=" currentLat "," currentLong //enlem ve boylam
"amp;radius=5000" // yakınlık yarıçapı
"amp;type=" placeTypeList[i] //gösterilecek yer tipleri
"amp;sensor=true" //sensor
"amp;key=" getResources().getString(R.string.google_map_key); //Google map key
//Json verilerini indirmek için place task methodunu çalıştır
new PlaceTask().execute(url);
}
});
}
private void getCurrentLocation() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Task<Location> task = fusedLocationProviderClient.getLastLocation();
task.addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
//başarılıysa
if (location != null){
//mevcut enlemi al
currentLat = location.getLatitude();
//mevcut boylamı al
currentLong = location.getLongitude();
//haritayı senkronize et
supportMapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
//harita hazır olduğu zaman
map = googleMap;
//haritadaki mevcut konumu yakınlaştır
map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(currentLat,currentLong),10));
}
});
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 44){
if (grantResults.length > 0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED ){
//izinler alındıysa, methodu cağır
getCurrentLocation();
}
}
}
private class PlaceTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... strings) {
String data = null;
try {
//verilerin başlatılması
data = downloadUrl(strings[0]);
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
@Override
protected void onPostExecute(String s) {
//parser task methodunu çalıştır
new ParserTask().execute(s);
}
}
private String downloadUrl(String string) throws IOException {
//url in başlatılması
URL url = new URL(string);
//bağlantının başlatılması
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//bağlantının bağlanması
connection.connect();
//input stream başlatılması
InputStream stream = connection.getInputStream();
// buffer reader başlatılması
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
//string builder başlatılması
StringBuilder builder = new StringBuilder();
//string değerlerinin başlatılması
String line = "";
while ((line = reader.readLine()) != null){
//line ekle
builder.append(line);
}
//append verisini al
String data = builder.toString();
//reader'i kapar
reader.close();
return data;
}
private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String,String>>> {
@Override
protected List<HashMap<String, String>> doInBackground(String... strings) {
//json parser sınıfı oluştur
JsonParser jsonParser = new JsonParser();
//hashmap list başlatılması
List<HashMap<String,String>> mapList = null;
JSONObject object = null;
try {
//json objesi başlatılması
object = new JSONObject(strings[0]);
//parse(ayrıştırma) jsonObject
mapList = jsonParser.parseResult(object);
}
catch (JSONException e){
e.printStackTrace();
}
//return mapList
return mapList;
}
@Override
protected void onPostExecute(List<HashMap<String, String>> hashMaps) {
//map'i temizle
map.clear();
for (int i = 0; i<hashMaps.size(); i ){
//hashmap başlatılması
HashMap<String,String> hashMapList = hashMaps.get(i);
//Enlem al
double lat = Double.parseDouble(hashMapList.get("lat"));
//boylam al
double lng = Double.parseDouble(hashMapList.get("lng"));
//isim al
String name = hashMapList.get("name");
//enlem ve boylamı bağla
LatLng latLng = new LatLng(lat,lng);
// marker options başlatılması
MarkerOptions options = new MarkerOptions();
//enlem boylamın pozisyonunu ayarla
options.position(latLng);
//başlık oluştur
options.title(name);
//haritaya marker ekle
map.addMarker(options);
}
}
}
}
мой класс JsonParser равен:
public class JsonParser {
private HashMap<String,String> parseJsonObject(JSONObject object) {
//Hashmap başlatılması
HashMap<String,String> dataList = new HashMap<>();
try {
//objeden isim al
String name = object.getString("name");
//objeden enlem al
String latitude = object.getJSONObject("geometry").getJSONObject("location").getString("lat");
//objeden boylam al
String longitude = object.getJSONObject("geometry").getJSONObject("location").getString("lng");
//tüm verileri hashmap'e koy
dataList.put("name", name);
dataList.put("lat", latitude);
dataList.put("lng", longitude);
}
catch (JSONException e){
e.printStackTrace();
}
//return Hashmap
return dataList;
}
private List<HashMap<String,String>> parseJsonArray(JSONArray jsonArray) {
//HashmapList başlatılması
List<HashMap<String,String>> dataList = new ArrayList<>();
for (int i = 0; i<jsonArray.length(); i ){
try {
//hashmap başlatılması
HashMap<String,String> data = parseJsonObject((JSONObject) jsonArray.get(i));
//HashMap List'e verileri ekle
dataList.add(data);
}
catch (JSONException e){
e.printStackTrace();
}
}
//return HashMapList
return dataList;
}
public List<HashMap<String,String>> parseResult(JSONObject object) {
//Json array'in başlatılması
JSONArray jsonArray = null;
try {
//results array'i al
jsonArray = object.getJSONArray("results");
}
catch (JSONException e){
e.printStackTrace();
}
//return array
return parseJsonArray(jsonArray);
}
}
Красные линии:
Process: com.gamze.pawsbook, PID: 30879
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:354)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
at org.json.JSONTokener.nextValue(JSONTokener.java:94)
at org.json.JSONObject.<init>(JSONObject.java:159)
at org.json.JSONObject.<init>(JSONObject.java:176)
at com.gamze.pawsbook.MapActivitiy$ParserTask.doInBackground(MapActivitiy.java:225)
at com.gamze.pawsbook.MapActivitiy$ParserTask.doInBackground(MapActivitiy.java:215)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Почему я не смог увидеть места??? пожалуйста, помогите мне..
Комментарии:
1. 2020-08-16 00:48:54Z, Лицензия: CC BY-SA 4.0
InflateException
2. @MikeM. я добавил
3. Это то, что вы ищете, в последней
Caused by
строке:API key not found. Check that <meta-data android:name="com.google.android.geo.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml
. У вас есть этот<meta-data>
элемент в вашем манифесте? Если да, то это в нужном месте?4. Вы были правы, я добавил ключ API в файл манифеста, но все равно, когда я хочу перейти к MapsActivity, программа завершается сбоем. @MikeM.
5. Каково текущее исключение?
Ответ №1:
Ошибка заключается в том, что вы используете метод onCreate внутри FragmentActivity
. Вместо этого вы должны раздуть его в методе onCreateView:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_maps, container, false);
}
Другой способ — расширить действие вместо действия фрагмента, в этом случае вам следует изменить свой public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{ //your code }
Для public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{ //your code}