Cannot convert from android.support.v4.app.Fragment to android.app.Fragment

77,979

Solution 1

Try to use getSupportFragmentManager() instead getFragmentManager()

Solution 2

Whats going on here?

While the Android Support package gives you a backwards-compatible Fragment implementation, the ActionBar is not part of the Android Support package. Hence, ActionBar.TabListener is expecting native API Level 11 Fragment objects. Consider using ActionBarSherlock to have both an action bar and Android Support fragments.

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

The FragmentPagerAdapter in the Android Support package is a bit messy -- it wants API Level 11 Fragment objects, not Android Support Fragment objects. However, you can clone the source to FragmentPagerAdapter (source is in your SDK) and create your own implementation that uses the support.v4 flavor of Fragment and kin.

Solution 3

This solution works for me

replace

public class MyFragment extends Fragment{
}

with

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

and also replace import

import android.app.Fragment;

with

import android.support.v4.app.Fragment;

Solution 4

I know that it has been too late to answer this question but it might help someone with the same problem.

Go to your java folder and click on your fragment's activity.

In the imports, replace import android.app.Fragment; with

import android.support.v4.app.Fragment;

Keep the code in the MainActivity intact and this should help resolve the issue.

Note: If it doesn't work at once, don't worry. Build > Rebuild project.

Share:
77,979

Related videos on Youtube

Kjell-Bear
Author by

Kjell-Bear

Updated on July 09, 2022

Comments

  • Kjell-Bear
    Kjell-Bear almost 2 years

    I'm doing my first Android app, and wanted to get straight into the ICS API. I have so far created an app using an ActionBar, with swipeable tabs using Viewpager and Fragments.

    I do however experience some errors that I keep returning to.

    Depending on how I implement it, it always keep going back to an "Type mismatch" error: "cannot convert from android.support.v4.app.Fragment to android.app.Fragment". I have tried removing all import references to either, and this error appears when I only use android.support.v4.app.Fragment in TabListener, FragmentActivity and my two Fragments.

    The error occurs in my 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  
        }
    }
    

    By removing "android.app.FragmentTransaction ft", replacing it with just "FragmentTransaction ft", the problem goes awawy. Then new problems arise:

    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

    Whats going on here?

    As you may understand, I'm new to Java and Android development. I feel like I'm pretty close, but I'm not able to solve this problem. I don't understand why it want to "convert from android.support.v4.app.Fragment to android.app.Fragment when I'm not even importing android.app.Fragment anywhere.

    I guess it's related to using the compatibility package. (Do I have to use this package at all when creating an app for the newest version of the SDK?)

  • Kjell-Bear
    Kjell-Bear over 12 years
    I understand. I have tried removing the need to use the support package, but then I'm left with another problem in my FragmentPagerAdapter - which I can't import as "android.app.FragmentPagerAdapter". >The return type is incompatible with FragmentPagerAdapter.getItem(int) MainFragmentActivity.java It tries here to return fragment, which is Fragment mFragment = LatestFragment.newInstance(position);
  • CommonsWare
    CommonsWare over 12 years
    It is perfectly reasonable to have a build target of API Level 11 or higher and use the Android Support package.
  • Jave
    Jave over 12 years
    @CommonsWare: I was under the impression that the support package (v4) was built on features from API level 11 (the v13 package slipped my mind), but in op's case, when he develops for ICS (API>13), the contents of the packages should be supported without additional packages, or am I wrong?
  • CommonsWare
    CommonsWare over 12 years
    @Jave: Well, I can't quite follow everything the OP wrote. :-) If you are only deploying to API Level 11 and higher, you can use the native Fragment implementation supplied by API Level 11. If you are deploying to older devices, you need to use the Android Support package, regardless of your build target. It's entirely possible to want an ICS build target for selective things (e.g., CalendarContract) that can be bypassed on older devices, yet still want to use the Android Support package for fundamental stuff that needs to be fully backwards-compatible.
  • Kjell-Bear
    Kjell-Bear over 12 years
    Cloning the FragmentPagerAdapter, and asking it to use android.app.Fragment/import android.app.FragmentManager/import android.app.FragmentTransaction seems to have worked.. No errors this time! Thanks
  • Jave
    Jave over 12 years
    @CommonsWare: Then I am with you there, My assumption was that OP was targeting and deploying on API level >13.
  • Kjell-Bear
    Kjell-Bear over 12 years
    I was being a bit unclear, mainly because of being new to this, and bad language. I am targeting > 13
  • MattF
    MattF about 12 years
    SLekvak, does your implementation work on api 11 and lower devices, or just on api 13+?
  • Newts
    Newts over 11 years
    I try this TutViewerFragment viewer = (TutViewerFragment)getSupportFragmentManager().findFragmentB‌​yId(R.id.tutview_fra‌​gment); but shows error "cannot cast from fragment to TutView Fragment"
  • gayavat
    gayavat over 11 years
    what is parent of TutViewerFragment?
  • Newts
    Newts over 11 years
    its extends from FragmentActivity
  • Mazen Kasser
    Mazen Kasser over 10 years
    @gayavat, why when I use getSupportFragmentManager(); Android Studio says undefined!
  • gayavat
    gayavat over 10 years
  • Admin
    Admin over 8 years
    @gayavat hi. I am stuck at same problem. But i need to implement ViewPager in Fragment,not Activity. What should i do??