Не удается преобразовать из android.support.v4.app.Fragment в android.app.Fragment - PullRequest
44 голосов
/ 25 января 2012

Я делаю свое первое приложение для 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?)

Ответы [ 8 ]

126 голосов
/ 21 мая 2012

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

14 голосов
/ 25 января 2012

Что здесь происходит?

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

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

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

4 голосов
/ 29 ноября 2016

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

заменить

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 голосов
/ 19 апреля 2015

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

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

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

import android.support.v4.app.Fragment;

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

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

0 голосов
/ 24 мая 2018

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

0 голосов
/ 05 августа 2014

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

0 голосов
/ 08 ноября 2013

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

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

0 голосов
/ 25 января 2012

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

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

...