У меня есть «android.view.InflateException: строка двоичного XML-файла # 11: строка двоичного XML-файла # 11: Ошибка при раздувании фрагмента класса»

#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}