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