Ищем неправильный класс фрагмента с библиотекой совместимости Android - PullRequest
9 голосов
/ 01 апреля 2011

Я пытаюсь надуть макет, содержащий фрагмент, используя пакет обратной совместимости и 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 {

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

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

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

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

Ответы [ 7 ]

41 голосов
/ 08 апреля 2011

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

Пожалуйста, измените Activity class на 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. изменить на перечисление API 10 (например: simple_list_item_1) с simple_list_item_activation_1

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

15 голосов
/ 05 января 2012

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

7 голосов
/ 08 апреля 2011

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

2 голосов
/ 13 сентября 2011

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

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

1 голос
/ 07 апреля 2011

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

0 голосов
/ 22 марта 2013

Я получил

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

0 голосов
/ 10 мая 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...