【问题标题】:Error: incompatible types: Fragment cannot be converted to MapFragment错误:不兼容的类型:Fragment 无法转换为 MapFragment
【发布时间】:2016-03-09 19:11:49
【问题描述】:

在我的项目中,我使用的是带有标签的导航抽屉。在其中一个标签中,我想调用谷歌地图,但我遇到了这个错误:

Error: incompatible types: Fragment cannot be converted to MapFragment

包含地图的片段:

public class PrimaryFragment extends Fragment implements OnMapReadyCallback{

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.primary_layout,container,false);
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        //toDO 
    }
}

标签片段

public class TabFragment extends Fragment {

public static TabLayout tabLayout;
public static ViewPager viewPager;
public static int int_items = 3 ;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View x =  inflater.inflate(R.layout.tab_layout,null);
        tabLayout = (TabLayout) x.findViewById(R.id.tabs);
        viewPager = (ViewPager) x.findViewById(R.id.viewpager);
    viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));

    tabLayout.post(new Runnable() {
        @Override
        public void run() {
                tabLayout.setupWithViewPager(viewPager);
               }
    });

    return x;

}

class MyAdapter extends FragmentPagerAdapter{

    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {
      switch (position){
          case 0 : return new PrimaryFragment();
          case 1 : return new SocialFragment();
          case 2 : return new UpdatesFragment();
      }
    return null;
    }

    @Override
    public int getCount() {

        return int_items;

    }

    @Override
    public CharSequence getPageTitle(int position) {

        switch (position){
            case 0 :
                return "Primary";
            case 1 :
                return "Social";
            case 2 :
                return "Updates";
        }
            return null;
    }
}
}

主要活动

public class MainActivity extends FragmentActivity{
DrawerLayout mDrawerLayout;
NavigationView mNavigationView;
FragmentManager mFragmentManager;
FragmentTransaction mFragmentTransaction;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
         mNavigationView = (NavigationView) findViewById(R.id.shitstuff) ;
         mFragmentManager = getSupportFragmentManager();
         mFragmentTransaction = mFragmentManager.beginTransaction();
         mFragmentTransaction.replace(R.id.containerView,new TabFragment()).commit();

         mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
         @Override
         public boolean onNavigationItemSelected(MenuItem menuItem) {
            mDrawerLayout.closeDrawers();



             if (menuItem.getItemId() == R.id.nav_item_sent) {
                 FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                 fragmentTransaction.replace(R.id.containerView,new SentFragment()).commit();

             }

            if (menuItem.getItemId() == R.id.nav_item_inbox) {
                FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction();
                xfragmentTransaction.replace(R.id.containerView,new TabFragment()).commit();
            }

             return false;
        }

    });

            android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
            ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, toolbar,R.string.app_name,
            R.string.app_name);

            mDrawerLayout.setDrawerListener(mDrawerToggle);

            mDrawerToggle.syncState();
}
}

primary_fragment的xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment
    class="com.google.android.gms.maps.MapFragment"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.google.android.gms.maps.MapFragment"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

我在片段上导入android.support.v4.app.Fragment,在主要活动上导入android.support.v4.app.FragmentActivity

【问题讨论】:

  • 尝试投射到 SupportMapFragment
  • 代码中的哪一行抛出了这个错误,你能粘贴你的布局xml吗?
  • 上线MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
  • Itzik Samara 评论解决了我的问题。谢谢大家

标签: android google-maps android-fragments


【解决方案1】:

使用 SupportMapFragment 解决了我的问题:(tnx @Itzzik Samara)

SupportMapFragment mMapFragment = SupportMapFragment.newInstance();

而不是

MapFragment mMapFragment = MapFragment.newInstance();

【讨论】:

    【解决方案2】:

    这对我来说似乎是一个转换问题,您尝试将其转换为 MapFragment

    MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
    

    【讨论】:

    • 这是引发错误的行。关于如何修复它的任何建议?奇怪的是,当我只使用没有标签的导航抽屉时,我已经使用了同一行而没有任何错误。
    【解决方案3】:
    1. 转到您的 MainActivity.java
    2. 删除这行代码: SupportMapFragment mapFragment = (SupportMapFragment)getSupportFragmentManager() .findFragmentById(R.id.map);
    3. 现在用这个新代码替换 Point No 2 代码: MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
    4. 现在重新构建您的项目。你准备好了。

    【讨论】:

      【解决方案4】:

      正如 Itzik Samara 在 cmets 上所说,通过转换 SupportMapFragment 而不是 MapFragment 解决了这个问题

      【讨论】:

        【解决方案5】:

        使用 SupportMapFragment 而不是 MapFragment 并通过进入 Refractor 菜单并在 android studio 中点击 Migrate to AndroidX 将项目折射到 androidx 中你的项目。它适用于任何地图 SDK 版本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-13
          • 1970-01-01
          • 1970-01-01
          • 2021-12-20
          • 2017-05-18
          • 2017-12-28
          • 2019-02-26
          • 2021-04-27
          相关资源
          最近更新 更多