2013-06-30 78 views
0

我有一個管理片段列表的活動。我添加的一個新片段是擴展ListFragmet而不是Fragment,並將其作爲其他片段添加到activity xml佈局文件中。我在我聲明ListFragment的行處從此文件中獲取InflatingException。這個聲明有什麼問題?Android - 錯誤膨脹類片段

活動XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <fragment android:name="com.example.foodexp01b.HomeFragment" 
      android:id="@+id/homeFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
    <fragment android:name="com.example.foodexp01b.LoginFragment" 
      android:id="@+id/loginFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
    <fragment android:name="com.example.foodexp01b.SettingsFragment" 
      android:id="@+id/settingsFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

    <fragment android:name="com.example.foodexp01b.DestinationFragment" 
      android:id="@+id/destinationFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
    <fragment 
      android:id="@+id/mapFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:name="com.google.android.gms.maps.SupportMapFragment"/> 

    <fragment android:name="com.example.foodexp01b.RestaurantFragment" 
      android:id="@+id/restaurantFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

    <fragment android:name="com.example.foodexp01b.FavoritesFragment" 
      android:id="@+id/favoritesFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

</LinearLayout> 

活動的OnCreate代碼

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     uiHelper = new UiLifecycleHelper(this, callback); 
     uiHelper.onCreate(savedInstanceState); 

     FragmentManager fm = getSupportFragmentManager(); 
     fragments[LOGIN] = fm.findFragmentById(R.id.loginFragment); 
     fragments[HOME] = fm.findFragmentById(R.id.homeFragment); 
     fragments[SETTINGS] = fm.findFragmentById(R.id.settingsFragment); 
     fragments[SETTINGS].getView().findViewById(R.id.back_button1) 
     .setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       currentFragment = HOME; 
       showFragment(HOME, false); 
      } 
     }); 
     fragments[DESTINATIONS] = fm.findFragmentById(R.id.destinationFragment); 
     fragments[DESTINATIONS].getView().findViewById(R.id.back_button2) 
     .setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       currentFragment = HOME; 
       showFragment(HOME, false); 
      } 
     }); 
     fragments[MAP] = fm.findFragmentById(R.id.mapFragment); 
     fragments[RESTAURANT] = fm.findFragmentById(R.id.restaurantFragment); 
     fragments[RESTAURANT].getView().findViewById(R.id.restaurant_back_button) 
     .setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       currentFragment = MAP; 
       showFragment(MAP, false); 
      } 
     }); 
     fragments[FAVORITES].getView().findViewById(R.id.favoritesFragment); 
     FragmentTransaction transaction = fm.beginTransaction(); 
     for(int i = 0; i < fragments.length; i++) { 
      transaction.hide(fragments[i]); 
     } 
     transaction.commit(); 
    } 

FavoritesFragment OnCreateView代碼

@Override 
    public View onCreateView(LayoutInflater inflater, 
      ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     View view = inflater.inflate(android.R.layout.simple_list_item_1, container, false); 
     favorites = new ArrayList<String>(); 
     setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, favorites)); 

     getListView().setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position,long id) { 
       } 
      }); 
     return view; 
    } 

登錄

06-30 20:17:53.609: E/AndroidRuntime(675): FATAL EXCEPTION: main 
06-30 20:17:53.609: E/AndroidRuntime(675): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.foodexp01b/com.example.foodexp01b.MainActivity}: android.view.InflateException: Binary XML file line #36: Error inflating class fragment 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2063) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.app.ActivityThread.access$600(ActivityThread.java:134) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.os.Looper.loop(Looper.java:137) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.app.ActivityThread.main(ActivityThread.java:4744) 
06-30 20:17:53.609: E/AndroidRuntime(675): at java.lang.reflect.Method.invokeNative(Native Method) 
06-30 20:17:53.609: E/AndroidRuntime(675): at java.lang.reflect.Method.invoke(Method.java:511) 
06-30 20:17:53.609: E/AndroidRuntime(675): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
06-30 20:17:53.609: E/AndroidRuntime(675): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
06-30 20:17:53.609: E/AndroidRuntime(675): at dalvik.system.NativeStart.main(Native Method) 
06-30 20:17:53.609: E/AndroidRuntime(675): Caused by: android.view.InflateException: Binary XML file line #36: Error inflating class fragment 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
06-30 20:17:53.609: E/AndroidRuntime(675): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:262) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.app.Activity.setContentView(Activity.java:1867) 
06-30 20:17:53.609: E/AndroidRuntime(675): at com.example.foodexp01b.MainActivity.onCreate(MainActivity.java:118) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.app.Activity.performCreate(Activity.java:5008) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2027) 
06-30 20:17:53.609: E/AndroidRuntime(675): ... 11 more 
06-30 20:17:53.609: E/AndroidRuntime(675): Caused by: java.lang.IllegalStateException: Content view not yet created 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.support.v4.app.ListFragment.getListView(ListFragment.java:222) 
06-30 20:17:53.609: E/AndroidRuntime(675): at com.example.foodexp01b.FavoritesFragment.onCreateView(FavoritesFragment.java:63) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:884) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1066) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1168) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:280) 
06-30 20:17:53.609: E/AndroidRuntime(675): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) 
06-30 20:17:53.609: E/AndroidRuntime(675): ... 21 more 
+0

使用LogCat檢查與您的異常相關的Java堆棧跟蹤。如果您無法解釋堆棧跟蹤信息,請編輯您的問題併發布堆棧跟蹤(例如,使用Ctrl-C從DDMS的LogCat視圖複製突出顯示的行到剪貼板)。 – CommonsWare

+0

對不起,忘了發佈日誌 – ezy

回答

1

您正在呼叫getListView()onCreateView()。問題是ListView創建onCreateView(),所以直到你從onCreateView()返回,超類還沒有ListView呢。

我建議您將onCreateView()代碼移動到onActivityCreated(),屆時ListView將被創建。此外,你可以擺脫那個局部變量,因爲你不使用它。並且,如果FavoritesFragmentListFragment,而不是調用setOnItemClickListener(),請覆蓋片段中的onListItemClick()

+0

謝謝,我已將代碼移至onActivityCreated()。但是eclipse告訴我:「代碼getListView()方法setOnListItemClick(new OnListItemClick(){})未定義類型ListView」。setOnListItemClick – ezy

+0

@ user2265222:ListView沒有'setOnListItemClick()'方法。我建議在你的片段**上重寫** onListItemClick()**,如果該片段是一個ListFragment:http://developer.android.com/reference/android/app/ListFragment.html#onListItemClick (android.widget.ListView,android.view.View,int,long) – CommonsWare

+0

明白了,但在主要活動中,我必須管理要顯示哪個片段以及要隱藏哪個片段(可預測您的解釋)在創建活動時拾取片段時爲空例外。我應該從ListFragment調用一個回調來設置它在正確的時間? – ezy