0

У меня есть управление списком фрагментов. Добавленный новый фрагмент расширяет ListFragmet вместо Fragment, и я добавил его в файл макета xml-активности как другие фрагменты. Я получаю исключение InflatingException из этого файла в строке, где объявляю ListFragment. Что не так с этим заявлением?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» для копирования выделенных строк из представления LogCat DDMS в буфер обмена). – CommonsWare

+0

Да, извините, забыли опубликовать журнал – ezy

ответ

1

Вы звоните getListView() в onCreateView(). Проблема в том, что ListView создан вonCreateView(), поэтому пока вы не вернетесь с onCreateView(), у суперкласса еще нет ListView.

Я бы рекомендовал вам переместить код onCreateView() на номер onActivityCreated(), до которого будет создано ListView. Кроме того, вы можете избавиться от локальной переменной view, так как вы ее не используете. И, если FavoritesFragment является ListFragment, вместо того, чтобы звонить setOnItemClickListener(), переопределите onListItemClick() в вашем фрагменте.

+0

Спасибо, я перевел код на onActivityCreated(). Но eclipse говорит мне: «Метод setOnListItemClick (новый OnListItemClick() {}) не определен для типа ListView« с кодом getListView(). 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