it-swarm.com.ru

Не удается преобразовать из Android.support.v4.app.Fragment в Android.app.Fragment

Я работаю над своим первым Android-приложением и хочу получить доступ к API ICS. До сих пор я создал приложение, используя ActionBar, со смахиваемыми вкладками, используя Viewpager и Fragments.

Я, однако, испытываю некоторые ошибки, к которым я продолжаю возвращаться.

В зависимости от того, как я его реализую, всегда происходит возврат к ошибке «Несоответствие типов»: «невозможно преобразовать из Android.support.v4.app.Fragment в Android.app.Fragment». Я попытался удалить все ссылки на импорт, и эта ошибка появляется, когда я использую только Android.support.v4.app.Fragment в TabListener, FragmentActivity и двух моих фрагментах.

Ошибка происходит в моем TabListener:

import Android.app.ActionBar;
import Android.app.ActionBar.Tab;
import Android.app.Activity;
import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentTransaction;
import Android.support.v4.view.ViewPager;
import Android.util.Log;

public class TabListener implements ActionBar.TabListener {
    private Android.app.Fragment fragment;
    private Activity activity;
    private ViewPager pager;
    private FragmentTransaction ft;

    public TabListener(Activity activity, Fragment fragment, ViewPager pager) {
        this.activity = activity;
        this.fragment = fragment;
        this.pager = pager;
    }

    @Override
    public void onTabSelected(Tab tab, Android.app.FragmentTransaction ft){     
        if (fragment == null) {
            ft.add(fragment, null);
        } else {
            ft.attach(fragment);
        }
    }

    @Override
    public void onTabReselected(Tab tab, Android.app.FragmentTransaction ft){
        // TODO Auto-generated method stub
    }

    @Override
    public void onTabUnselected(Tab tab, Android.app.FragmentTransaction ft){
        // TODO Auto-generated method stub  
    }
}

При удалении «Android.app.FragmentTransaction ft», заменяя его просто «FragmentTransaction ft», проблема исчезает. Тогда возникают новые проблемы:

Метод onTabReselected (ActionBar.Tab, FragmentTransaction) типа TabListener должен переопределить или реализовать метод супертипа TabListener.Java.

Метод onTabSelected (ActionBar.Tab, FragmentTransaction) типа TabListener должен переопределить или реализовать метод супертипа TabListener.Java.

Метод onTabUnselected (ActionBar.Tab, FragmentTransaction) типа TabListener должен переопределить или реализовать метод супертипа TabListener.Java.

Тип TabListener должен реализовывать унаследованный абстрактный метод ActionBar.TabListener.onTabReselected (ActionBar.Tab, FragmentTransaction) TabListener.Java

Тип TabListener должен реализовывать унаследованный абстрактный метод ActionBar.TabListener.onTabSelected (ActionBar.Tab, FragmentTransaction) TabListener.Java

Тип TabListener должен реализовывать унаследованный абстрактный метод ActionBar.TabListener.onTabUnselected (ActionBar.Tab, FragmentTransaction) TabListener.Java

Что тут происходит?

Как вы понимаете, я новичок в разработке на Java и Android. Я чувствую, что я довольно близко, но я не могу решить эту проблему. Я не понимаю, почему он хочет "конвертировать из Android.support.v4.app.Fragment в Android.app.Fragment, когда я нигде не импортирую Android.app.Fragment.

Я думаю, это связано с использованием пакета совместимости. (Нужно ли вообще использовать этот пакет при создании приложения для новейшей версии SDK?)

43
SLekvak

Попробуйте использовать getSupportFragmentManager() вместо getFragmentManager()

123
gayavat

Что тут происходит?

В то время как пакет поддержки Android предоставляет вам обратно совместимую реализацию Fragment, ActionBar является не частью пакета поддержки Android. Следовательно, ActionBar.TabListener ожидает нативные объекты API уровня 11 Fragment. Попробуйте использовать ActionBarSherlock, чтобы иметь как панель действий, так и фрагменты поддержки Android.

но тогда я остался с другой проблемой в моем FragmentPagerAdapter

FragmentPagerAdapter в пакете поддержки Android немного запутан - ему нужны объекты Fragment уровня API 11, а не объекты Fragment поддержки Android. Однако вы можете клонировать источник в FragmentPagerAdapter (источник находится в вашем SDK) и создать свою собственную реализацию, которая использует разновидность support.v4Fragment и kin.

14
CommonsWare

Я знаю, что было слишком поздно, чтобы ответить на этот вопрос, но это может помочь кому-то с той же проблемой. 

Перейдите в папку Java и нажмите на активность вашего фрагмента.

В импорте замените import Android.app.Fragment; на 

import Android.support.v4.app.Fragment;

Сохраните код в MainActivity в неизменном виде, и это должно помочь решить проблему.

Примечание: если это не работает сразу, не волнуйтесь. Построить> Перестроить проект .

4
4127157

Это решение работает для меня

замещать 

public class MyFragment extends Fragment{
}

с

public class MyFragment extends Android.support.v4.app.Fragment{
}

а также заменить импорт

import Android.app.Fragment;

с

import Android.support.v4.app.Fragment;
4
Tausif Ul Rahman

смотрите здесь: fragmentTransaction.add(R.id.main_container, new HomeFragment()); вы добавляете фрагмент, но следите, вы используете метод replace(), поэтому вы должны использовать replace вместо add()

0
X.Fain

У меня была такая же проблема вчера.

Существует действительно хорошая страница Samsung , которая охватывает ActionBarSherlock . Проверьте, используете ли вы один из методов импорта/классов/слева, и замените их методами импорта/классов/справа.

0
Lesik2008

У меня такая же проблема. Решил это, изменив интерфейс с implements ActionBar.TabListener на implements TabListener и затем реализовав методы внутри этого интерфейса. Также упоминается ошибка, которую вы упомянули.

0
RmK

Вы можете удалить пакет поддержки, и это должно решить вашу проблему. Он нужен только тогда, когда вам нужны функции из Android 3.0 и выше в приложениях для более ранних версий.
В вашем случае вы получаете как Фрагменты по умолчанию из ICS, так и Фрагменты из пакета поддержки, и если вам удастся получить объекты из разных пакетов, они не будут работать вместе. 

Укороченная версия; Вы используете либо уровень API выше Honecomb или пакет поддержки, а не оба. 

0
Jave