38

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

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

В зависимости от того, как я его реализую, он всегда возвращается к ошибке «Ошибка несоответствия типа»: «невозможно преобразовать из 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 футов", заменив его просто "FragmentTransaction футов", проблема идет awawy. Затем возникают новые проблемы:

The method onTabReselected(ActionBar.Tab, FragmentTransaction) of type TabListener must override or implement a supertype method TabListener.java

The method onTabSelected(ActionBar.Tab, FragmentTransaction) of type TabListener must override or implement a supertype method TabListener.java

The method onTabUnselected(ActionBar.Tab, FragmentTransaction) of type TabListener must override or implement a supertype method TabListener.java

The type TabListener must implement the inherited abstract method ActionBar.TabListener.onTabReselected(ActionBar.Tab, FragmentTransaction) TabListener.java

The type TabListener must implement the inherited abstract method ActionBar.TabListener.onTabSelected(ActionBar.Tab, FragmentTransaction) TabListener.java

The type TabListener must implement the inherited abstract method ActionBar.TabListener.onTabUnselected(ActionBar.Tab, FragmentTransaction) TabListener.java

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

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

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

ответ

0

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

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

+0

Я понимаю. Я попытался удалить необходимость использования пакета поддержки, но тогда у меня осталась другая проблема в моем FragmentPagerAdapter, которую я не могу импортировать как «android.app.FragmentPagerAdapter». > Возвращаемый тип несовместим с FragmentPagerAdapter.getItem (int) MainFragmentActivity.java Здесь он пытается вернуть фрагмент, который является фрагментом mFragment = LatestFragment.newInstance (position); – SLekvak

+1

Совершенно разумно иметь цель сборки уровня API 11 или выше * и * использовать пакет поддержки Android. – CommonsWare

+0

@CommonsWare: у меня создалось впечатление, что пакет поддержки (v4) был построен на функциях с уровня API 11 (пакет v13 проскользнул у меня), но в случае op, когда он разрабатывает ICS (API> 13), содержимое пакетов должно поддерживаться без дополнительных пакетов, или я ошибаюсь? – Jave

14

Whats going on here?

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

but then I'm left with another problem in my FragmentPagerAdapter

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

+0

Клонирование FragmentPagerAdapter и просил его использовать android.app.Fragment/import android.app.FragmentManager/import android.app.FragmentTransaction, похоже, сработал. На этот раз ошибок нет! Спасибо – SLekvak

+0

SLekvak, твоя реализация работает на api 11 и более низких устройствах, или просто на api 13+? – MattF

116

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

+0

Я пытаюсь использовать этот TutViewerFragment viewer = (TutViewerFragment) getSupportFragmentManager(). FindFragmentById (R.id.tutview_fragment); но показывает, что ошибка «не может отбрасываться из фрагмента в фрагмент TutView» – Newts

+0

Что такое родительский элемент TutViewerFragment? – gayavat

+0

его распространяется от FragmentActivity – Newts

0

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

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

0

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

4

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

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

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

import android.support.v4.app.Fragment;

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

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

4

This solution works for me

заменить

public class MyFragment extends Fragment{ 
} 

с

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

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

import android.app.Fragment; 

с

import android.support.v4.app.Fragment; 
Смежные вопросы