【问题标题】:Using Fragments Causes Crash使用 Fragments 会导致崩溃
【发布时间】:2016-12-04 14:13:17
【问题描述】:

我一直在努力创建最简单的项目,这会导致我遇到问题。我最初认为这是一个地图问题,直到我意识到这可能是一个一般(支持库?)片段问题。 (我尝试在我的 SGII v4.1.2 上运行此代码)

Java 代码:

package com.example.testapp;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MSMap extends FragmentActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_msmap);
  }
}

XML 布局

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

上面用“error inflating”给出这个错误:

03-09 12:06:56.850: E/AndroidRuntime(891): 致命异常: main 03-09 12:06:56.850:E/AndroidRuntime(891):java.lang.RuntimeException: 无法开始活动 组件信息{com.example.testapp/com.example.testapp.MSMap}: android.view.InflateException:二进制 XML 文件第 9 行:错误 膨胀类片段 03-09 12:06:56.850: E/AndroidRuntime(891): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 03-09 12:06:56.850: E/AndroidRuntime(891): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 03-09 12:06:56.850: E/AndroidRuntime(891): 在 android.app.ActivityThread.access$700(ActivityThread.java:140) 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 03-09 12:06:56.850: E/AndroidRuntime(891): 在 android.os.Handler.dispatchMessage(Handler.java:99) 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.os.Looper.loop(Looper.java:137) 03-09 12:06:56.850: E/Android 运行时(891):在 android.app.ActivityThread.main(ActivityThread.java:4921) 03-09 12:06:56.850:E/AndroidRuntime(891):在 java.lang.reflect.Method.invokeNative(Native Method) 03-09 12:06:56.850:E/AndroidRuntime(891):在 java.lang.reflect.Method.invoke(Method.java:511) 03-09 12:06:56.850: E/Android 运行时(891):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 03-09 12:06:56.850: E/AndroidRuntime(891): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 03-09 12:06:56.850:E/AndroidRuntime(891):在 dalvik.system.NativeStart.main(本机方法)03-09 12:06:56.850: E/AndroidRuntime(891):引起:android.view.InflateException: 二进制 XML 文件第 9 行:膨胀类片段时出错 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 03-09 12:06:56.850: E/AndroidRuntime(891): 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.view.LayoutInflater.inflate(LayoutInflater.java:489) 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.view.LayoutInflater.inflate(LayoutInflater.java:396) 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.view.LayoutInflater.inflate(LayoutInflater.java:352) 03-09 12:06:56.850:E/AndroidRuntime(891):在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:313) 03-09 12:06:56.850: E/AndroidRuntime(891): 在 android.app.Activity.setContentView(Activity.java:1924) 03-09 12:06:56.850:E/AndroidRuntime(891):在 com.example.testapp.MSMap.onCreate(MSMap.java:23) 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.app.Activity.performCreate(Activity.java:5206) 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 03-09 12:06:56.850: E/AndroidRuntime(891): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 03-09 12:06:56.850: E/AndroidRuntime(891): ... 11 更多 03-09 12:06:56.850:E/AndroidRuntime(891):原因: java.lang.NullPointerException: 名称 == null 03-09 12:06:56.850: E/Android 运行时(891):在 java.lang.VMClassLoader.findLoadedClass(Native Method) 03-09 12:06:56.850:E/AndroidRuntime(891):在 java.lang.ClassLoader.findLoadedClass(ClassLoader.java:354) 03-09 12:06:56.850:E/AndroidRuntime(891):在 java.lang.ClassLoader.loadClass(ClassLoader.java:491) 03-09 12:06:56.850:E/AndroidRuntime(891):在 java.lang.ClassLoader.loadClass(ClassLoader.java:461) 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.support.v4.app.Fragment.instantiate(Fragment.java:391) 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.support.v4.app.Fragment.instantiate(Fragment.java:369) 03-09 12:06:56.850:E/AndroidRuntime(891):在 android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:272) 03-09 12:06:56.850: E/AndroidRuntime(891): 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) 03-09 12:06:56.850: E/AndroidRuntime(891): ... 21 更多

代码和 XML 之间是否存在某种不匹配?

  • 我尝试过让我的代码扩展活动和片段活动吗?
  • XML 包含片段周围的相对布局?那是一个 不知何故有问题?

在所有情况下,我都尝试了所有我能想到的例子和/或谷歌我的方式。所有这些都会导致相同的错误。

注意:我的项目中有“参考库”和“Android 依赖项”和“库”中有 android-support-v4.jar。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    你的问题终于得到答案了

    片段的工作方式与活动非常相似,因为您需要一个 Java 类文件来配合它。您不能仅通过创建片段布局来创建片段 - 您需要为片段创建一个类:

    为您的活动创建布局 XML 和活动子类 为您的片段创建布局 XML 和片段子类 在您的 Activity 布局 XML 中将两者联系在一起(如果您想在 Java 代码中执行,则使用 FragmentTransaction) 如果您还没有这样做,请阅读、重新阅读并消化此页面上的所有内容:http://developer.android.com/guide/topics/fundamentals/fragments.html

    那里有很多,但片段现在是 Android 应用程序的重要组成部分,因此需要阅读。好消息是片段的基础非常简单。

    所以你需要有这样的课程

    <fragment
           class="com.exercise.FragmentTest.MyFragment"
    

    【讨论】:

      【解决方案2】:

      你没有为你的 Fragment 指定名字,你应该在你的片段的 name 属性中提供你的片段类

      如下代码:

      <fragment        
          android:name="com.yourPackageName.YourFragmentClass" 
          android:id="@+id/themap"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
           />
      

      【讨论】:

      • 在原始地图演示中,他们使用了这个 class="com.google.android.gms.maps.SupportMapFragment"。 (根据我的阅读,“类”和“名称”或多或少可以互换)但是,使用它时我遇到了同样的问题。 (完全相同的错误。)我想我应该尝试找到一个简单的完整片段示例,看看是否仍然出现错误。
      • @Tom ,对于使用片段,您必须为片段定义一个扩展列表片段的类......所以您必须在片段布局中定义片段类。在您定义的片段类中它是 onCreateView() 函数中自己的布局。它没有你想象的那么难
      • 谢谢。仅供参考,这是我使用 maps/support-fragments 发现的多个示例之一,这些示例给出了我得到的相同错误:dj-android.blogspot.in/2013/02/…(我想 Google 地图类扩展了 listfragment 或类似的,这就是它应该工作的原因。也许是两个不同的原因给了我同样的错误。我试图查明错误发生的位置,所以我可以进一步研究。但我会尝试在我自己的项目中创建一个片段“演示”,我将用它来替换谷歌地图。这样我就可以诊断出这两个问题中的哪一个是罪魁祸首)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多