2014-01-11 41 views
0

問候研究員#1社區,谷歌地圖V2例外:在分段錯誤充氣類片段

我正在開發Android應用程序,在片段和ViewPager顯示谷歌地圖V2。 而我面臨的一個問題是關於擴展包含Google Maps V2的片段佈局。我正在搜索並尋找此鏈接Android, google maps fragment and viewpager - Error inflating class fragment獲取答案,因爲該方法與我一直在尋找的方法相同,在片段中誇大Google Maps V2,但仍然無效。 我也在這個鏈接Android Google Maps in Fragment也在搜索,但結果是一樣的。

這是我fragment_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true" 
    > 
    <LinearLayout 
     android:id="@+id/layout_detail_fragment_secondlist" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:background="#ffffff" 
     > 
     <ImageView 
      android:id="@+id/detail_item_imv_secondlist" 
      android:layout_width="match_parent" 
      android:layout_height="150dp" 
      android:contentDescription="@null" 
      android:scaleType="fitCenter" 
      android:adjustViewBounds="true" 
      /> 
     <TextView 
      android:id="@+id/detail_item_tv_title_secondlist" 
      android:layout_width="match_parent" 
      android:layout_height="30dp" 
      android:background="#cae0e0e0" 
      android:gravity="left|center_vertical" 
      android:textSize="15sp" 
      android:textStyle="bold" 
      /> 
     <TextView 
      android:id="@+id/detail_item_tv_content_secondlist" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="fill" 
      android:padding="10dp" 
      android:textSize="12sp" 
      android:lineSpacingMultiplier="1.5" 
      /> 
     <fragment 
      android:id="@+id/detail_item_map_content_secondlist" 
      android:layout_width="match_parent" 
      android:layout_height="150dp" 
      class="com.google.android.gms.maps.SupportMapFragment" 
      /> 
    </LinearLayout> 
</ScrollView> 

這是我fragment_class:

package com.gbu.app.template.fragments; 

import java.util.ArrayList; 

import com.gbu.app.template.DetailSecondListActivity; 
import com.gbu.app.template.R; 
import com.gbu.app.template.data.StoreObject; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class DetailSecondListViewPagerFragment extends Fragment { 
    private ImageView detail_item_imv_secondlist; 
    private LinearLayout layout_detail_fragment_secondlist; 
    private TextView detail_item_tv_title_secondlist, detail_item_tv_content_secondlist; 
    private DisplayMetrics detail_metrics_secondlist; 
    private ArrayList<StoreObject> detail_store; 

    @Override 
    public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflator, container, savedInstanceState); 
     View view_detail_secondlist = inflator.inflate(R.layout.item_viewpager_detail_secondlist, container, false); 
     savedInstanceState = getArguments(); 
     detail_metrics_secondlist = new DisplayMetrics(); 
     getActivity().getWindowManager().getDefaultDisplay().getMetrics(detail_metrics_secondlist); 
     layout_detail_fragment_secondlist = (LinearLayout) view_detail_secondlist.findViewById(R.id.layout_detail_fragment_secondlist); 
     detail_item_imv_secondlist = (ImageView) layout_detail_fragment_secondlist.findViewById(R.id.detail_item_imv_secondlist); 
     detail_item_tv_title_secondlist = (TextView) layout_detail_fragment_secondlist.findViewById(R.id.detail_item_tv_title_secondlist); 
     detail_item_tv_content_secondlist = (TextView) layout_detail_fragment_secondlist.findViewById(R.id.detail_item_tv_content_secondlist); 
     detail_store = new ArrayList<StoreObject>(); 
     detail_store = DetailSecondListActivity.detail_store; 
     startApp(savedInstanceState); 
     return view_detail_secondlist; 
    } 

    private void startApp(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     detail_item_imv_secondlist.getLayoutParams().height = (int) (detail_metrics_secondlist.heightPixels * 0.38); 
     detail_item_imv_secondlist.setImageResource(R.drawable.default_images); 
     detail_item_tv_title_secondlist.setText(detail_store.get(savedInstanceState.getInt("current_item")).getTitle()); 
     detail_item_tv_content_secondlist.setText(detail_store.get(savedInstanceState.getInt("current_item")).getAddress()); 
    } 

    public void onDestroyView() { 
     super.onDestroyView(); 
     Log.d("message", "onDestroyView"); 
    } 
} 

這是pager_adapter:

package com.gbu.app.template.adapters; 

import com.gbu.app.template.DetailSecondListActivity; 
import com.gbu.app.template.fragments.DetailSecondListViewPagerFragment; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

public class DetailSecondListPagerAdapter extends FragmentPagerAdapter { 
    DetailSecondListViewPagerFragment dslvpf; 
    Bundle args; 

    public DetailSecondListPagerAdapter(FragmentManager fm) { 
     super(fm); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public Fragment getItem(int arg0) { 
     // TODO Auto-generated method stub 
     dslvpf = new DetailSecondListViewPagerFragment(); 
     args = new Bundle(); 
     args.putInt("current_item", arg0); 
     dslvpf.setArguments(args); 
     return dslvpf; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return DetailSecondListActivity.detail_store.size(); 
    } 

} 

這是佈局Main_Activity。 xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 
    <android.support.v4.view.ViewPager 
     android:id="@+id/detail_view_pager_second_list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     /> 
</RelativeLayout> 

這是我Main_Activity的代碼:

package com.gbu.app.template; 

import java.util.ArrayList; 

import com.gbu.app.template.adapters.DetailSecondListPagerAdapter; 
import com.gbu.app.template.data.StoreObject; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.view.ViewPager; 

public class DetailSecondListActivity extends FragmentActivity { 
    private Intent i; 
    public static ArrayList<StoreObject> detail_store; 
    private ViewPager detail_viewpager_secondlist; 
    private DetailSecondListPagerAdapter detail_secondlist_pager_adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_detail_secondlist); 
     detail_viewpager_secondlist = (ViewPager) findViewById(R.id.detail_view_pager_second_list); 
     detail_store = new ArrayList<StoreObject>(); 
     detail_store = SecondListActivity.item_store; 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     detail_secondlist_pager_adapter = new DetailSecondListPagerAdapter(getSupportFragmentManager()); 
     detail_viewpager_secondlist.setAdapter(detail_secondlist_pager_adapter); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     TabGroupActivity parentActivity = (TabGroupActivity) getParent(); 
     parentActivity.onActivityResult(3, RESULT_OK, i); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == 4 && resultCode == RESULT_OK) { 
      i = data; 
      startApp(data); 
     } 
    } 

    private void startApp(Intent data) { 
     // TODO Auto-generated method stub 
     detail_viewpager_secondlist.setCurrentItem(data.getIntExtra("position", 0)); 
    } 
} 

這是AndroidManifest.xml中:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.gbu.app.template" 
    android:versionCode="1" 
    android:versionName="1.0" xmlns:tools="http://schemas.android.com/tools"> 

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

    <permission 
     android:name="com.gbu.app.template.permission.MAPS_RECEIVE" 
     android:protectionLevel="signature" /> 

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

    <uses-permission android:name="com.gbu.app.template.permission.MAPS_RECEIVE"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <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_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.gbu.app.template.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> 
     <activity 
      android:name="com.gbu.app.template.TemplateTabActivity" 
      android:label="@string/app_name" > 
     </activity> 
     <activity 
      android:name="com.gbu.app.template.FirstListActivity" 
      android:label="@string/app_name" > 
     </activity> 
     <activity 
      android:name="com.gbu.app.template.DetailFirstListActivity" 
      android:label="@string/app_name" > 
     </activity> 
     <activity 
      android:name="com.gbu.app.template.SecondTabActivity" 
      android:label="@string/app_name" > 
     </activity> 
     <activity 
      android:name="com.gbu.app.template.SecondListActivity" 
      android:label="@string/app_name" > 
     </activity> 
     <activity 
      android:name="com.gbu.app.template.DetailSecondListActivity" 
      android:label="@string/app_name" > 
     </activity> 
     <activity 
      android:name="com.gbu.app.template.MapviewActivity" 
      android:label="@string/app_name" > 
     </activity> 
     <meta-data 
      android:name="com.google.android.maps.v2.API_KEY" 
      android:value="AIzaSyCYbyZhouA71LgSsWbZxnFEyQrt_Q_xdHQ"/> 
    </application> 

</manifest> 

我的問題是,如果我將谷歌地圖V2在Main_Activity,地圖工作得很好,顯示正常。但是,如果我放置片段,結果將觸發異常:錯誤膨脹類片段。這是一個顯示異常的logcat的,我不知道是什麼原因引起的,因爲它沒有顯示類似的ClassNotFoundException或NullException或某事的原因是導致它:

01-11 12:05:44.879: E/AndroidRuntime(7711): android.view.InflateException: Binary XML file line #40: Error inflating class fragment 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:752) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:760) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.LayoutInflater.inflate(LayoutInflater.java:495) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at com.gbu.app.template.fragments.DetailSecondListViewPagerFragment.onCreateView(DetailSecondListViewPagerFragment.java:32) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.support.v4.view.ViewPager.populate(ViewPager.java:1068) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.support.v4.view.ViewPager.populate(ViewPager.java:914) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:681) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5055) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5055) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5055) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2549) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5055) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5055) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5055) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2549) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5055) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:847) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5055) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:681) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.View.measure(View.java:16420) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5055) 
01-11 12:05:44.879: E/AndroidRuntime(7711):  at android.widget.FrameLayout.onM 

它只是從我的代碼說我fragment_class中,錯誤指向只在充氣佈局在:

View view_detail_secondlist = inflator.inflate(R.layout.item_viewpager_detail_secondlist, container, false); 

所以,我在這裏失蹤了什麼?這是我沒有添加的一些代碼?或者,我可能沒有真正理解開發片段的概念,Google Maps V2? 任何幫助將會是重要的,謝謝。

+0

您還沒有顯示地圖初始化這個它MapFragment。請給我看。 – Kishan

+0

謝謝你的回覆..即使我沒有初始化它,通常它會顯示地圖..我以前在我的Main_Activity嘗試過,並正常工作,即使我沒有初始化它.. –

回答

1

刪除 super.onCreateView(inflator, container, savedInstanceState);OnCreate嘗試使用try catch block而膨脹。
聲明View view_detail_secondlist;全球

 @Override 
    public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflator, container, savedInstanceState); 

    if (container == null) { 
     return null; 
    } 

    if (view_detail_secondlist != null) { 
     ViewGroup parent = (ViewGroup) view_detail_secondlist.getParent(); 
     if (parent != null) 
      parent.removeView(view_detail_secondlist); 
    } 

    try { 
     view_detail_secondlist = inflator.inflate(R.layout.item_viewpager_detail_secondlist, container, false); 
    } catch (InflateException e) { 
     // Log.wtf("S*****", e.getMessage()); 
    } 
    savedInstanceState = getArguments(); 
    detail_metrics_secondlist = new DisplayMetrics(); 
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(detail_metrics_secondlist); 
    layout_detail_fragment_secondlist = (LinearLayout) view_detail_secondlist.findViewById(R.id.layout_detail_fragment_secondlist); 
    detail_item_imv_secondlist = (ImageView) layout_detail_fragment_secondlist.findViewById(R.id.detail_item_imv_secondlist); 
    detail_item_tv_title_secondlist = (TextView) layout_detail_fragment_secondlist.findViewById(R.id.detail_item_tv_title_secondlist); 
    detail_item_tv_content_secondlist = (TextView) layout_detail_fragment_secondlist.findViewById(R.id.detail_item_tv_content_secondlist); 
    detail_store = new ArrayList<StoreObject>(); 
    detail_store = DetailSecondListActivity.detail_store; 
    startApp(savedInstanceState); 
    return view_detail_secondlist; 
} 
+0

我是多麼愚蠢..忘了加入try catch塊..謝謝..我已經試過你的方法,現在正常工作..真的很感激它.. –

+0

我用另一種方法來顯示片段中的地圖,現在因爲這只是繞過了異常..在我的layout_fragment,我把地圖放在FrameLayout中,然後我編程地添加地圖..它的工作沒有任何問題.. –

0

DetailSecondListViewPagerFragment

+0

謝謝你的答案。但我之前嘗試過,但結果是一樣的.. –

0

您正在使用支持片段類,如果你的目標不是舊的SDK變化

+0

這應該被放置在評論部分...如果你沒有評論的聲望,那麼請不要在回答部分評論.. –

+0

謝謝你的回覆..但在AndroidManifest很顯然,我的目標是老的Sdk .. –

相關問題