2013-02-12 5 views
1

У меня есть активность, которая будет содержать три фрагмента, у которых есть макеты listView и та, которые имеют относительную компоновку.Почему я не могу раздуть свои фрагменты в Android?

Вот XML для деятельности:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id = "@+id/activity_main_large" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" xmlns:tools="http://schemas.android.com/tools"> 

    <fragment 
     android:id="@+id/menu_category_fragment" 
     android:name="com.thesis.menubook.MenuCategory" 
     android:layout_width="123dp" 
     android:layout_height="match_parent" 
     tools:layout="@layout/activity_menu_category" /> 

    <fragment 
     android:id="@+id/menu_fragment" 
     android:name="com.thesis.menubook.MenuFragment" 
     android:layout_width="0dip" 
     android:layout_height="match_parent" 
     android:layout_weight="0.35" 
     tools:layout="@layout/activity_menu_fragment" /> 

    <fragment 
     android:id="@+id/orderlist_fragment" 
     android:name="com.thesis.menubook.OrderListFragment" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_weight="0.08" 
     tools:layout="@layout/activity_order_list" /> 

</LinearLayout> 

А вот файл Java для основного вида деятельности

package com.thesis.menubook; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 


public class MenuMain extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_menu_main); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.layout.activity_menu_main, menu); 
     return true; 
    } 

} 

Там, так что я просто пытаюсь загрузить пустые фрагменты, чтобы увидеть, если они на самом деле загрузится, а затем добавит виджеты и коды для импорта данных в фрагменты. Но я получаю сообщение об ошибке java.lang.RuntimeException: Unable to start activity ComponentInfo{com.thesis.menubook/com.thesis.menubook.MenuMain}:

Есть ли что-нибудь, что я упускаю из виду, поэтому он не может загрузить пустые фрагменты?

Вот мой LogCat (обновляется после исправления имен классов):

02-12 23:04:28.369: E/AndroidRuntime(1143): FATAL EXCEPTION: main 
02-12 23:04:28.369: E/AndroidRuntime(1143): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.thesis.menubook/com.thesis.menubook.MenuMain}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1748) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.ActivityThread.access$1500(ActivityThread.java:122) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.os.Looper.loop(Looper.java:132) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.ActivityThread.main(ActivityThread.java:4025) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at java.lang.reflect.Method.invoke(Method.java:491) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at dalvik.system.NativeStart.main(Native Method) 
02-12 23:04:28.369: E/AndroidRuntime(1143): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:724) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.view.LayoutInflater.inflate(LayoutInflater.java:479) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.view.LayoutInflater.inflate(LayoutInflater.java:391) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.view.LayoutInflater.inflate(LayoutInflater.java:347) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.Activity.setContentView(Activity.java:1780) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at com.thesis.menubook.MenuMain.onCreate(MenuMain.java:15) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  ... 11 more 
02-12 23:04:28.369: E/AndroidRuntime(1143): Caused by: java.lang.ClassCastException: com.thesis.menubook.MenuCategory cannot be cast to android.app.Fragment 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.Fragment.instantiate(Fragment.java:493) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.Fragment.instantiate(Fragment.java:468) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.app.Activity.onCreateView(Activity.java:4132) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664) 
02-12 23:04:28.369: E/AndroidRuntime(1143):  ... 20 more 
02-12 23:04:28.905: D/dalvikvm(1143): GC_CONCURRENT freed 329K, 6% free 7390K/7815K, paused 12ms+20ms 
02-12 23:04:34.180: I/Process(1143): Sending signal. PID: 1143 SIG: 9** 

MenuCategory.java

пакет com.thesis.menubook;

импорт android.os.Bundle; import android.support.v4.app.Fragment; импорт android.view.LayoutInflater; импорт android.view.View; import android.view.ViewGroup;

общественного класса MenuCategory расширяет Fragment { @Override общественности Посмотреть onCreateView (LayoutInflater инфлятор, ViewGroup контейнер, Bundle savedInstanceState) {

 View view = inflater.inflate(R.layout.activity_menu_category, container, false); 
     return view; 
} 

}

MenuFragment.java

package com.thesis.menubook; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class MenuFragment extends Fragment{ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

      View view = inflater.inflate(R.layout.activity_menu_fragment, container, false); 
      return view; 
     } 


    } 

OrderListFragment.java

package com.thesis.menubook; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class OrderListFragment extends Fragment{ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.activity_order_list, container, false); 
     return view; 
    } 
} 

Вот файлы XML для фрагментов:

activity_menu_category

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


</ListView> 

activity_menu_fragment

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:layout_width="match_parent" 
    android:layout_height="match_parent" android:gravity="bottom|top" xmlns:android="http://schemas.android.com/apk/res/android" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="16dp"> 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:contentDescription="@string/hello_world" 
     android:paddingTop="20dp" /> 

</RelativeLayout> 

activity_order_list

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

    <!-- Name Label --> 
    <TextView 
     android:id="@+id/categoryname" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="20sp" 
     android:textStyle="bold" /> 
</LinearLayout> 

ответ

2

Вот ваш ответ

Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.example.android.fragments.MenuCategory: make sure class name exists, is public, and has an empty constructor that is public 

Убедитесь, что по умолчанию/пустой public конструктор в MenuCategory, а также убедитесь, что MenuCategory не является внутренним классом, если это то, что должно быть public и static.

1

У вас есть MenuCategory, MenuFragment, OrderListFragment занятий в вашем проекте? И если у вас есть их в пакете под названием com.example.android.fragments? Если у вас есть эти классы, но вы помещаете их в свой собственный пакет, вам нужно будет изменить имя пакета в макете xml самостоятельно, а не com.example.

+0

У меня есть они в моем проекте. SO, мне нужно создать новую папку и назвать ее как таковой, а затем поместить в указанную папку? –

+0

вы могли бы это сделать, но вместо этого вы должны просто изменить 'com.example.android.fragments' на' com.thesis.menubook' в вашем XML-файле макета. – FoamyGuy

+0

Я видел их в файле xml и менял их, но он по-прежнему имеет ту же ошибку –

0

Ответ прямо в сообщение об ошибке:

Невозможно создать экземпляр фрагментировать com.example.android.fragments.MenuCategory

Вы должны иметь в своем проекте, класс которого полное имя является com.example.android.fragments.MenuCategory, то есть подкласс фрагмента, и имеет конструктор без ARGS

Отредактировано добавить:

в теге в макете:

<fragment 
     android:id=blah blah blah 
     android:name="com.thesis.menubook.MenuCategory" 

... вы называете класс Java. В вашем примере это «com.thesis.menubook.MenuCategory». Как я уже сказал, этот класс должен существовать в вашем проекте, расширять фрагмент и иметь конструктор no-args (на самом деле вы не должны давать никакого конструктора вообще, так что он имеет только свой конструктор по умолчанию). Для каждого фрагмента фрагмента у вас должен быть такой класс, соответствующий значению каждого атрибута android: name.

+0

Я изменил его на com.thesis.menubook.MenuCategory и он по-прежнему имеет ту же ошибку –

3

Вы используете неправильный класс фрагментов. Вы используете фрагменты библиотеки поддержки android.support.v4.app.Fragment. И он ожидает реализацию встроенных фреймов: android.app.Fragment.

Если вы хотите использовать библиотеку поддержки, чтобы использовать ее в старых версиях, ваша деятельность должна быть расширена android.support.v4.app.FragmentActivity. Затем вы должны использовать метод getSupportFragmentManager() для получения FragmentManager и добавления фрагментов.

+0

потрясающий. Все остальные ответы полностью игнорируют точку и дают некоторые общие рекомендации. Это одно место - и все же оно последнее и даже не было поддержано. – fdreger

0

1) Вы должны изменить значение minSdkVersion на 11 в Anroidmanifest.xml. 2) Проверьте правильность значения имени фрагмента, указанного в файле mainactivity.xml, например, имя_файла.Fragmentclassname.

Смежные вопросы