[英]I have “android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class fragment”
I want to add google maps and the user can see the their location and the nearby vets.我想添加谷歌地图,用户可以看到他们的位置和附近的兽医。 But when i run the code i have "android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class fragment" error.
但是当我运行代码时,我有“android.view.InflateException:二进制 XML 文件第 11 行:二进制 XML 文件第 11 行:膨胀 ZA2F2ED4F8EBC2CBB4C21A29DC40AB6 片段错误”。 How can i fix it??
我该如何解决?
I added a map activity in my app.我在我的应用程序中添加了 map 活动。 The activity work successfully.
活动顺利进行。 But it does not show location which i want to see.
但它没有显示我想看到的位置。 For exampe when i choose the hospital anyting change.
例如,当我选择医院任何变化时。 What is wrong in my code?
我的代码有什么问题?
my MapActivity is:我的 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
"&radius=5000"+// yakınlık yarıçapı
"&type="+ placeTypeList[i] + //gösterilecek yer tipleri
"&sensor=true"+ //sensor
"&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 && 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 && 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);
}
}
}
}
my jsonParser class is:我的 jsonParser class 是:
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);
}
}
The red lines:红线:
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)
Why i could not see the places???为什么我看不到这些地方??? please help me..
请帮我..
The error is because you are using an onCreate method inside a FragmentActivity
.该错误是因为您在
FragmentActivity
中使用了 onCreate 方法。 You should instead inflate it in the onCreateView method:您应该改为在 onCreateView 方法中对其进行膨胀:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_maps, container, false);
}
Another way is to extend an activity instead of Fragment Activity, in that case you should change your public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{ //your code }
另一种方法是扩展 Activity 而不是 Fragment Activity,在这种情况下,您应该更改您的
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{ //your code }
to public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{ //your code}
public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{ //your code}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.