安卓 android.view.InflateException 二进制 XML 文件第16行:膨胀类片段错误

3
这里是MainActivity类。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List;
import org.json.JSONObject;
import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;
import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnMapClickListener; import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.PolylineOptions;
public class MainActivity extends FragmentActivity {
GoogleMap map; ArrayList<LatLng> markerPoints;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
// 初始化 markerPoints = new ArrayList<>();
// 获取 activity_main 中 SupportMapFragment 的引用 SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
// 获取 Button 的引用 Button btnDraw = (Button)findViewById(R.id.btn_draw);
// 获取 SupportMapFragment 的 Map map = fm.getMap();
// 在地图上启用“我的位置”按钮 map.setMyLocationEnabled(true);
// 为地图设置单击事件监听器 map.setOnMapClickListener(new OnMapClickListener() {
@Override public void onMapClick(LatLng point) {
// 当已经有10个点时,不再添加 if(markerPoints.size()>=10){ return; }
// 添加新的点到 ArrayList 中 markerPoints.add(point);
// 创建 MarkerOptions MarkerOptions options = new MarkerOptions();
// 设置标记的位置 options.position(point);
/** * 对于起点,标记为绿色, * 对于终点,标记为红色, * 对于其他点,标记为天蓝色 */ if(markerPoints.size()==1){ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); }else if(markerPoints.size()==2){ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); }else{ options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)); }
// 将新的标记添加到 Google Map Android API V2 上 map.addMarker(options);
} });
// 地图上长按将清除所有点 map.setOnMapLongClickListener(new OnMapLongClickListener() {
@Override public void onMapLongClick(LatLng point) { // 清除地图上所有点 map.clear();
// 清除 ArrayList 中所有点 markerPoints.clear();
} });
// 为 Button btn_draw 设置单击事件监听器 btnDraw.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) { // 检查是否已经捕捉到起点和终点 if(markerPoints.size() >= 2){ LatLng origin = markerPoints.get(0); LatLng dest = markerPoints.get(1);
// 获取到 Google Directions API 的 URL String url = getDirectionsUrl(origin, dest);
DownloadTask downloadTask = new DownloadTask();
// 开始从 Google Directions API 下载 JSON 数据 downloadTask.execute(url); }
} });
}
private String getDirectionsUrl(LatLng origin,LatLng dest){
// 起点 String str_origin = "origin="+origin.latitude+","+origin.longitude;
// 终点 String str_dest = "destination="+dest.latitude+","+dest.longitude;
// 是否启用传感器 String sensor = "sensor=false";
// 途经点 String waypoints = ""; for(int i=2;i{
// 在非 UI 线程中下载数据 @Override protected String doInBackground(String... url) {
// 用于存放来自 Web 服务的数据 String data = "";
try{ // 从 Web 服务获取数据 data = downloadUrl(url[

Direction Parser类如下所示

package in.wptrafficanalyzer.locationwaypointmapv2;
import java.util.ArrayList; import java.util.HashMap; import java.util.List;
import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;
import com.google.android.gms.maps.model.LatLng; public class DirectionsJSONParser {
/** 接收一个JSONObject并返回包含纬度和经度的列表的列表 */ public List>> parse(JSONObject jObject){
List>> routes = new ArrayList>>(); JSONArray jRoutes = null; JSONArray jLegs = null; JSONArray jSteps = null;
try {
jRoutes = jObject.getJSONArray("routes");
/** 遍历所有路线 */ for(int i=0;i>();
/** 遍历所有腿 */ for(int j=0;j list = decodePoly(polyline);
/** 遍历所有点 */ for(int l=0;l hm = new HashMap(); hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude) ); hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude) ); path.add(hm); } } routes.add(path); } }
} catch (JSONException e) { e.printStackTrace(); }catch (Exception e){ }
return routes; }
/** * 用于解码折线点的方法 * 参考:jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java * */ private List decodePoly(String encoded) {
List poly = new ArrayList(); int index = 0, len = encoded.length(); int lat = 0, lng = 0;
while (index = 0x20); int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lat += dlat;
shift = 0; result = 0; do { b = encoded.charAt(index++) - 63; result |= (b & 0x1f) = 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng;
LatLng p = new LatLng((((double) lat / 1E5)), (((double) lng / 1E5))); poly.add(p); }
return poly; } }

Android Manifest.xml是:

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.INTERNET"/>

 <permission
      android:name="in.wptrafficanalyzer.locationwaypointmapv2.permission.MAPS_RECEIVE"
      android:protectionLevel="signature" />

<uses-permission android:name="in.wptrafficanalyzer.locationwaypointmapv2.permission.MAPS_RECEIVE" />

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true"/>


<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="in.wptrafficanalyzer.locationwaypointmapv2.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="AIzaSyC6TVk6gtR_i_.......**************"/>    

</application>

布局文件activity_main.xml如下:

<Button 
    android:id="@+id/btn_draw"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/str_btn_draw" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" />


<fragment 
    android:id="@+id/map"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"        
    class="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_above="@id/btn_draw" />

我的 LogCat 文件是

03-02 21:35:25.157: D/dalvikvm(25733): 启用CheckJNI 03-02 21:35:25.758: D/AndroidRuntime(25733): 关闭虚拟机 03-02 21:35:25.758: W/dalvikvm(25733): 线程id=1: 线程退出时出现未捕获的异常 (group=0x40ddd2a0) 03-02 21:35:25.768: E/AndroidRuntime(25733): 致命错误: 无法启动活动ComponentInfo{in.wptrafficanalyzer.locationwaypointmapv2/in.wptrafficanalyzer.locationwaypointmapv2.MainActivity}: android.view.InflateException: 二进制XML文件第16行: 膨胀类片段错误 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.ActivityThread.access$700(ActivityThread.java:140) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.os.Handler.dispatchMessage(Handler.java:99) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.os.Looper.loop(Looper.java:137) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.ActivityThread.main(ActivityThread.java:4935) 03-02 21:35:25.768: E/AndroidRuntime(25733): at java.lang.reflect.Method.invokeNative(Native Method) 03-02 21:35:25.768: E/AndroidRuntime(25733): at java.lang.reflect.Method.invoke(Method.java:511) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 03-02 21:35:25.768: E/AndroidRuntime(25733): at dalvik.system.NativeStart.main(Native Method) 03-02 21:35:25.768: E/AndroidRuntime(25733): Caused by: android.view.InflateException: 二进制XML文件第16行: 膨胀类片段错误 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.view.LayoutInflater.rInflate(LayoutInflater.java:752) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.view.LayoutInflater.inflate(LayoutInflater.java:495) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 03-02 21:35:25.768: E/AndroidRuntime(25733): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.Activity.setContentView(Activity.java:1924) 03-02 21:35:25.768: E/AndroidRuntime(25733): at in.wptrafficanalyzer.locationwaypointmapv2.MainActivity.onCreate(MainActivity.java:43) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app.Activity.performCreate(Activity.java:5206) 03-02 21:35:25.768: E/AndroidRuntime(25733): at android.app

请帮忙

2个回答

4
问题出现在这里:
<meta-data
   android:name="com.google.android.maps.v2.API_KEY"
    android:value="AIzaSyC6TVk6gtR_i_.......**************"/> 
标签期望的是一个整数,因此您需要在此处包含您正在使用的com.google.android.maps库的版本。您可能会在您的项目中包含的库中找到它,然后只需定义:

<meta-data
   android:name="com.google.android.maps.v2.API_KEY"
   android:value="@integer/your_google_maps_version" />

我该如何将它更改为片段中的MapView,因为我想将此布局嵌入到我的应用程序的主容器中,其中包含一些操作。 - Umair Aziz
我认为你应该开一个新的问题,因为它与之前的问题无关,这样可能会有更多的用户能够更好地帮助你。 - nKn
为什么不请看一下并帮忙?http://stackoverflow.com/questions/22130915/android-migrating-activity-from-fragment-to-mapview - Umair Aziz

0
<meta-data
   android:name="com.google.android.maps.v2.API_KEY"
    android:value="AIzaSyC6TVk6gtR_i_.......**************"/> 

在 manifest.xml 文件中,在 application> 标签之后和第一个 activity 之前添加以下内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接