使用Android兼容性库寻找错误的片段类

时间:2011-04-01 08:21:53

标签: android android-fragments

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

当我在XLarge屏幕设备上以API级别11运行时,这一切都非常有效。

当我退回到针对10级进行编译并在正常大小的屏幕上运行时,我会在创建新活动并使其中的片段膨胀时失败。

  

引起:   抛出java.lang.ClassNotFoundException:   加载器中的android.view.fragment   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 {

症状类似于这个问题,但我没有这些错误 inflating fragments with compatibility package android

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

我在清单中(我尝试过不同的名称变体)。     

在开始使用片段时,我首先在蜂窝设备上使用了API 11,这一切都完美无缺。它是使用兼容性库来获取相同的代码(修改为使用稍微不同的兼容性API),我有这个问题。任何想法都会非常受欢迎。谢谢, 彼得

7 个答案:

答案 0 :(得分:41)

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

请将Activity课程更改为FragmentActivity

  1. public class FragmentLayout extends Activity {} - &GT; public class FragmentLayout extends FragmentActivity {}

  2. public static class DetailsActivity extends Activity {} - &GT; public static class DetailsActivity extends FragmentActivity {}

  3. 最后 getFragmentManager() - &gt; 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;

答案 1 :(得分:15)

我在兼容性库中遇到了同样错误的类问题,并尝试了上面提到的所有内容而没有运气。我终于明白了:我使用的是不正确的XML元素Fragment而不是更正一个fragment。资本化似乎很重要。

答案 2 :(得分:7)

我打赌你试图在setConetentView

super.onCreate之前致电FragmentActivity

答案 3 :(得分:2)

我在预蜂窝设备上运行的应用程序确实遇到了这个问题。我根据Dianne Hackborn的February 2011 blog post和其他标准Fragment参考资料中给出的示例编写了Fragment编码。问题的解决方案包含在SDK参考链接http://developer.android.com/sdk/compatibility-library.html#Using中。当要使用兼容性库部署这些应用程序时,必须在具有Fragments的应用程序中使用的类和方法名称存在细微差别。该链接解释了这一点。

下载和安装的兼容性库包含使用Fragments的示例代码。参考:Android Developers > Resources > Sample Code > API 4+ Support Demos

答案 4 :(得分:1)

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

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

<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。

答案 5 :(得分:0)

我认为你应该从构建路径中删除android-support-v4.jar。这将从Eclipse中的引用库中删除它。比creace文件夹libs并把jar放在那里。清理项目,Eclipse会将jar添加到Android依赖项中。这对我来说很有把戏,因为我正在努力解决未被发现的课程。

答案 6 :(得分: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错误,因此如果出现此错误,请检查是否支持所有导入的类。