9

我正在尝试使用向后兼容包和 SDK 级别 10 扩展包含片段的布局。我将 jar 文件放在我项目的 libs 文件夹中。我扩展了 FragmentActivity。

当我在 XLarge 屏幕设备上以 API 级别 11 运行时,这一切都运行良好。

当我退回到针对级别 10 进行编译并在正常大小的屏幕上运行时,我在创建新 Activity 并膨胀其中的片段时遇到故障。

引起:java.lang.ClassNotFoundException: android.view.fragment in loader dalvik.system.PathClassLoader[/data/app/com.motoappsummitagenda-1.apk] 04-01 01:07:14.311 2870 2870 E AndroidRuntime: at dalvik .system.PathClassLoader.findClass(PathClassLoader.java:243)

所以它看起来像是在某个地方寻找android.view.fragment,而不是兼容版本android.support.v4.app.Fragment。当然,在 API 级别 10 上不会找到 android.view.fragment。但是那个 android.view.fragment 是从哪里来的呢?

正在膨胀的 XML 是

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

它的代码开始:

package com.motorapp;

import java.util.List;
import java.util.ListIterator;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.support.v4.app.*;
import android.support.v4.util.*;
import android.support.v4.*;
import android.support.v4.widget.*; 

public class SessionFragment extends android.support.v4.app.Fragment {

症状类似于这个问题,但我没有那些错误 用兼容包android膨胀片段

android.compatibility.v4.android-support-v4 jar 文件位于我在 Eclipse 中的项目 > 属性 > Java 构建路径下的构建路径中

我在清单中有(并且我尝试了名称的不同变体)。

在开始使用 Fragment 时,我首先在蜂窝设备上使用 API 11,并且一切正常。正是在使用兼容性库时,我遇到了相同的代码(修改为使用略有不同的兼容性 API)。任何想法都会非常受欢迎。谢谢,彼得

4

7 回答 7

41

我刚刚在 Android API 8 机器(三星 Galaxy S)中解决了这个问题。

请将Activity班级更改为FragmentActivity.

  1. public class FragmentLayout extends Activity {} --> public class FragmentLayout extends FragmentActivity {}

  2. public static class DetailsActivity extends Activity {} --> public static class DetailsActivity extends FragmentActivity {}

  3. 终于 getFragmentManager()-->getSupportFragmentManager()

  4. 将 android-support-v4.jar 注册到 Eclipse 的引用库

  5. 将 android-support-v4.jar 放到 {你项目的根目录}/libs 目录

  6. 从 simple_list_item_activated_1 更改为 API 10 枚举(例如:simple_list_item_1)

  7. import android.support.v4.app.Fragment;

于 2011-04-08T07:24:26.327 回答
15

我在兼容性库中遇到了同样的错误类问题,并且尝试了上面提到的所有方法,但没有成功。我终于弄明白了:我使用了不正确的 XML 元素Fragment而不是正确的fragment. 大写似乎很重要。

于 2012-01-05T07:42:07.830 回答
7

我敢打赌你setConetentView之前试图super.onCreate在你的FragmentActivity

于 2011-04-08T08:12:29.893 回答
2

在蜂窝设备之前运行的应用程序中,我遇到了这个问题。我的片段编码基于 Dianne Hackborn 2011 年 2 月的博客文章和其他标准片段参考材料中给出的示例。问题的解决方案包含在 SDK 参考链接http://developer.android.com/sdk/compatibility-library.html#Using中。当这些应用程序要与兼容性库一起部署时,必须在具有片段的应用程序中使用的类和方法名称存在细微差别。该链接解释了这一点。

下载和安装的兼容性库包括使用片段的示例代码。参考:Android 开发人员 > 资源 > 示例代码 > API 4+ 支持演示

于 2011-09-13T11:34:18.627 回答
1

您提供的导入看起来都正确。仔细检查任何其他类以确保 Eclipse 没有在某些地方自动导入错误的片段。关键的另一件事是您需要将兼容性库添加到您必须在项目的根目录中创建的 lib\ 中,以确保它与您的应用程序捆绑在一起。我不知道是否需要,但我总是让我的项目构建路径引用它的副本。

您的布局似乎缺少类参数。我认为您的意思是使用您在布局中使用名称的类。

<fragment class="com.example.<class to path to your fragment>" android:id="@+id/items"
    android:layout_weight="1" android:layout_width="0px"
    android:layout_height="fill_parent" />

在 Eclipse 中,您应该在 Referenced Libraries 和 libs 下看到 android-support-v4.jar。

于 2011-04-07T16:15:39.743 回答
0

我认为您应该从构建路径中删除 android-support-v4.jar 。这将从 Eclipse 中的引用库中删除它。比创建文件夹库并将罐子放在那里。清理您的项目,Eclipse 会将 jar 添加到 Android 依赖项中。这对我有用,因为我正在努力解决类未发现异常。

于 2012-05-10T13:17:35.713 回答
0

我拿到

 java.lang.NoClassDefFoundError: com.android.example.SupportFragment
    at com.android.example.SupportFragmentActivity.onCreate()

SupportFragment extends SherlockFragment implements PopupMenu.OnMenuItemClickListener
...
    @Override
    public boolean onMenuItemClick(android.view.MenuItem item) {
        return onOptionsItemSelected(item);
    }

当尝试使 api 17 应用程序与 api 8 兼容时,唯一的指示是上面的 logcat 错误,因此如果遇到此错误,请检查是否支持所有导入的类。

于 2013-03-22T11:48:14.293 回答