Поиск неправильного класса фрагмента с помощью библиотеки совместимости с Android

Я пытаюсь раздуть макет, содержащий фрагмент, используя пакет обратной совместимости и уровень SDK 10. Я взял файл jar и поместил его в папку libs моего проекта. Я расширил FragmentActivity.

Все работает отлично, когда я запускаю на уровне API 11 на экранном устройстве XLarge.

Когда я возвращаюсь к компиляции против уровня 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. Разумеется, файл android.view.fragment не будет найден на уровне API 10. Но где этот файл 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 {

Симптомы похожи на эту проблему, но у меня нет таких ошибок раздувание фрагментов с андроидом совместимости

Файл jar android.compatibility.v4.android-support-v4 находится на моем пути сборки в Eclipse в разделе "Проект" > "Свойства" > "путь сборки Java"

У меня есть в манифесте (и я пробовал разные варианты имени).   

В начале работы с фрагментами я впервые использовал API 11 на сотовом устройстве, и все работает отлично. Он получает один и тот же код (модифицированный для использования немного другого API совместимости), работающий с библиотекой совместимости, который у меня есть. Любые идеи были бы очень желанными. Благодаря, Питер

Ответ 1

У меня была такая же неправильная проблема класса с библиотекой совместимости, и я попробовал все, что упоминалось выше, без везения. Я, наконец, понял это: я использовал неправильный XML-элемент Fragment, а не правильный Fragment. Капитализация, похоже, имеет значение.

Ответ 2

Я просто решил эту проблему в машине Android API 8 (Samsung Galaxy S).

Измените Activity класс на FragmentActivity.

  • public class FragmentLayout extends Activity {} - > public class FragmentLayout extends FragmentActivity {}

  • public static class DetailsActivity extends Activity {} - > public static class DetailsActivity extends FragmentActivity {}

  • наконец, getFragmentManager()getSupportFragmentManager()

  • зарегистрировать поддержку android-support-v4.jar в Eclipse, на которые ссылаются библиотеки

  • поместите файл android-support-v4.jar в каталог {root directory вашего проекта}/libs

  • изменить на перечисление API 10 (например: simple_list_item_1) из simple_list_item_activated_1

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

Ответ 3

Бьюсь об заклад, вы пытаетесь вызвать setConetentView до super.onCreate в FragmentActivity

Ответ 4

У меня была именно эта проблема с приложением, запущенным на устройствах с предварительной сотой. Я основывал свою кодировку фрагмента на примере, приведенном в Dianne Hackborn февральском сообщении в блоге в феврале 2011 года и в другом стандартном справочном материале фрагмента. Решение проблем содержится в справочной ссылке SDK, http://developer.android.com/sdk/compatibility-library.html#Using. Существуют незначительные различия в именах классов и методов, которые должны использоваться в приложениях с фрагментами, когда эти приложения должны быть развернуты с помощью библиотеки совместимости. Ссылка объясняет это.

Библиотека совместимости, загруженная и установленная, включает примерный код с использованием фрагментов. Ссылка: Разработчики Android > Ресурсы > Пример кодa > Поддержка API 4+

Ответ 5

Импорт, который вы предоставили, выглядят правильно. Сделайте двойную проверку других классов, чтобы убедиться, что 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 вы должны увидеть android-support-v4.jar как по ссылкам, так и по библиотекам.

Ответ 6

Я думаю, вы должны удалить android-support-v4.jar из пути сборки. Это приведет к удалению из библиотек ссылок в Eclipse. Затем скопируйте папки libs и поставьте там банку. Очистите свой проект, а Eclipse добавит jar в зависимости от Android. Это сделало трюк для меня, поскольку я боролся с классом, не найденным исключением.

Ответ 7

Я получил

 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 выше, поэтому убедитесь, что все импортированные классы поддерживаются, если вы получили эту ошибку.