无法启动活动(包含片段间通信)



我基本上是Android开发的新手。从各种YouTube频道学习,并遵循官方API指南。

我目前正在学习关于碎片,并找到了一个视频类似的需要。这里是链接。

我所做的基本上是做了两个片段,一个片段( FragmentA )包含一个简单的ListView,当我点击列表项时,相应的内容应该显示在下面的片段中,即: FragmentB

我已经按照教程中所示的所有步骤进行了操作,但是在运行时我仍然得到以下错误:
08-04 15:19:47.038  22144-22144/com.example.abhishek.fragmentmodularui E/AndroidRuntime﹕ FATAL EXCEPTION: main
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.abhishek.fragmentmodularui/com.example.abhishek.fragmentmodularui.MainActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2107)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2132)
                at android.app.ActivityThread.access$700(ActivityThread.java:140)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:4918)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
                at dalvik.system.NativeStart.main(Native Method)
         Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
                at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
                at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:313)
                at android.app.Activity.setContentView(Activity.java:1920)
                at com.example.abhishek.fragmentmodularui.MainActivity.onCreate(MainActivity.java:16)
                at android.app.Activity.performCreate(Activity.java:5185)
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2071)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2132)
                at android.app.ActivityThread.access$700(ActivityThread.java:140)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:4918)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
                at dalvik.system.NativeStart.main(Native Method)
         Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.example.abhishek.fragments.FragmentA: make sure class name exists, is public, and has an empty constructor that is public
                at android.app.Fragment.instantiate(Fragment.java:584)
                at android.app.Fragment.instantiate(Fragment.java:552)
                at android.app.Activity.onCreateView(Activity.java:4828)
                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
                at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
                at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:313)
                at android.app.Activity.setContentView(Activity.java:1920)
                at com.example.abhishek.fragmentmodularui.MainActivity.onCreate(MainActivity.java:16)
                at android.app.Activity.performCreate(Activity.java:5185)
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2071)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2132)
                at android.app.ActivityThread.access$700(ActivityThread.java:140)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:4918)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
                at dalvik.system.NativeStart.main(Native Method)
         Caused by: java.lang.ClassNotFoundException: com.example.abhishek.fragments.FragmentA
                at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
                at android.app.Fragment.instantiate(Fragment.java:574)
                at android.app.Fragment.instantiate(Fragment.java:552)
                at android.app.Activity.onCreateView(Activity.java:4828)
                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
                at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
                at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:313)
                at android.app.Activity.setContentView(Activity.java:1920)
                at com.example.abhishek.fragmentmodularui.MainActivity.onCreate(MainActivity.java:16)
                at android.app.Activity.performCreate(Activity.java:5185)
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2071)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2132)
                at android.app.ActivityThread.access$700(ActivityThread.java:140)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:4918)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
                at dalvik.system.NativeStart.main(Native Method)
下面是我剩下的代码: 1) MainActivity.java: http://pastebin.com/6r2a15AN

2)FragmentA.java: http://pastebin.com/UMDMKWVi

3)FragmentB.java: http://pastebin.com/i5q1pHdq4)Communicator.java: http://pastebin.com/fw0HbQa7

6)activity_main.xml: http://pastebin.com/8mw2cEHs

7)fragment_a.xml: http://pastebin.com/mq7RmSLe

8)fragment_b.xml: http://pastebin.com/Px90HWLN

AndroidManifest.xml: http://pastebin.com/bX71e80s

这里有什么问题?任何形式的帮助将不胜感激!

您的Fragment s和Activity似乎在com.example.abhishek.fragmentmodularui包中。在activity_main.xml中,两个片段名称都指向不存在的文件:

android:name="com.example.abhishek.fragments.FragmentA"

应该是

   android:name="com.example.abhishek.fragmentmodularui.FragmentA"
分别为

   android:name="com.example.abhishek.fragmentmodularui.FragmentB"

另外,你的respond()方法的实现是错误的。如下图所示,供参考。

public void respond(int i) {
    FragmentManager fragmentManager = getFragmentManager();
    FragmentB fragmentB = new FragmentB(); //This is WRONG
    fragmentB.changeData(i);
}

这里你不应该像你那样创建一个新的片段,因为它们是在Activity启动时创建的。现在发生的是,一个新的片段被创建,但没有初始化,所以你看到错误。您应该从FragmentManager获得现有的片段。正确的方法是

public void respond(int i) {
    FragmentManager fragmentManager = getFragmentManager();
    FragmentB fragmentB = (FragmentB) getFragmentManager().findFragmentById(R.id.fragment2);
    fragmentB.changeData(i);
}

但是你必须自己计算出bundlekey的参数

伙计,有些事情你做错了,如果你从android开发者网站学习一些细节会更好http://developer.android.com/training/basics/fragments/fragment-ui.html有下载链接下载样本项目研究你这样做是不对的

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        communicator = (Communicator)getActivity();
        listView = (ListView)getActivity().findViewById(R.id.listView);
        ArrayAdapter arrayAdapter = ArrayAdapter.createFromResource(getActivity(),R.array.titles,android.R.layout.simple_list_item_1);
        listView.setAdapter(arrayAdapter);
        listView.setOnItemClickListener(this);
    }

你应该这样做

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_a,container,false);
listView = (ListView)view.findViewById(R.id.listView);
        ArrayAdapter arrayAdapter = ArrayAdapter.createFromResource(getActivity(),R.array.titles,android.R.layout.simple_list_item_1);
        listView.setAdapter(arrayAdapter);
        listView.setOnItemClickListener(this);
        return view;
    }

最新更新