Duplicate ID, tag null, or parent id with another fragment for com.google.android.gms.maps.MapFragment

前端 未结 23 1592
-上瘾入骨i
-上瘾入骨i 2020-11-22 00:25

I have an application with three tabs.

Each tab has its own layout .xml file. The main.xml has its own map fragment. It\'s the one that shows up when the application

23条回答
  •  被撕碎了的回忆
    2020-11-22 01:05

    For those who are still running into this issue, the best way to make sure you don't get this error with a Map in a Tab is to make the Fragment extend SupportMapFragment instead of nesting a SupportMapFragment inside the Fragment used for the Tab.

    I just got this working using a ViewPager with a FragmentPagerAdapter, with the SupportMapFragment in the third Tab.

    Here is the general structure, note there is no need to override the onCreateView() method, and there is no need to inflate any layout xml:

    public class MapTabFragment extends SupportMapFragment 
                                        implements OnMapReadyCallback {
    
        private GoogleMap mMap;
        private Marker marker;
    
    
        public MapTabFragment() {
        }
    
        @Override
        public void onResume() {
            super.onResume();
    
            setUpMapIfNeeded();
        }
    
        private void setUpMapIfNeeded() {
    
            if (mMap == null) {
    
                getMapAsync(this);
            }
        }
    
        @Override
        public void onMapReady(GoogleMap googleMap) {
    
            mMap = googleMap;
            setUpMap();
        }
    
        private void setUpMap() {
    
            mMap.setMyLocationEnabled(true);
            mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            mMap.getUiSettings().setMapToolbarEnabled(false);
    
    
            mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    
                @Override
                public void onMapClick(LatLng point) {
    
                    //remove previously placed Marker
                    if (marker != null) {
                        marker.remove();
                    }
    
                    //place marker where user just clicked
                    marker = mMap.addMarker(new MarkerOptions().position(point).title("Marker")
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));
    
                }
            });
    
        }
    
    
    }
    

    Result:

    enter image description here

    Here is the full class code that I used to test with, which includes the placeholder Fragment used for the first two Tabs, and the Map Fragment used for the third Tab:

    public class MainActivity extends AppCompatActivity implements ActionBar.TabListener{
    
    
        SectionsPagerAdapter mSectionsPagerAdapter;
    
        ViewPager mViewPager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    
            // Set up the ViewPager with the sections adapter.
            mViewPager = (ViewPager) findViewById(R.id.pager);
            mViewPager.setAdapter(mSectionsPagerAdapter);
    
            final ActionBar actionBar = getSupportActionBar();
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
            mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                }
            });
    
            for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
                actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this));
            }
    
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
    
            int id = item.getItemId();
    
            if (id == R.id.action_settings) {
                return true;
            }
    
            return super.onOptionsItemSelected(item);
        }
    
        @Override
        public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
            mViewPager.setCurrentItem(tab.getPosition());
        }
    
        @Override
        public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
    
        }
    
        @Override
        public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
    
        }
    
    
        public class SectionsPagerAdapter extends FragmentPagerAdapter {
    
            public SectionsPagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public Fragment getItem(int position) {
    
                switch (position) {
                    case 0:
                        return PlaceholderFragment.newInstance(position + 1);
                    case 1:
                        return PlaceholderFragment.newInstance(position + 1);
                    case 2:
                        return MapTabFragment.newInstance(position + 1);
                }
    
                return null;
            }
    
            @Override
            public int getCount() {
                // Show 3 total pages.
                return 3;
            }
    
            @Override
            public CharSequence getPageTitle(int position) {
                Locale l = Locale.getDefault();
    
                switch (position) {
                    case 0:
                        return getString(R.string.title_section1).toUpperCase(l);
                    case 1:
                        return getString(R.string.title_section2).toUpperCase(l);
                    case 2:
                        return getString(R.string.title_section3).toUpperCase(l);
                }
                return null;
            }
        }
    
    
        public static class PlaceholderFragment extends Fragment {
    
            private static final String ARG_SECTION_NUMBER = "section_number";
    
            TextView text;
    
            public static PlaceholderFragment newInstance(int sectionNumber) {
                PlaceholderFragment fragment = new PlaceholderFragment();
                Bundle args = new Bundle();
                args.putInt(ARG_SECTION_NUMBER, sectionNumber);
                fragment.setArguments(args);
                return fragment;
            }
    
            public PlaceholderFragment() {
            }
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    
                text = (TextView) rootView.findViewById(R.id.section_label);
                text.setText("placeholder");
    
                return rootView;
            }
        }
    
        public static class MapTabFragment extends SupportMapFragment implements
                OnMapReadyCallback {
    
            private static final String ARG_SECTION_NUMBER = "section_number";
    
            private GoogleMap mMap;
            private Marker marker;
    
    
            public static MapTabFragment newInstance(int sectionNumber) {
                MapTabFragment fragment = new MapTabFragment();
                Bundle args = new Bundle();
                args.putInt(ARG_SECTION_NUMBER, sectionNumber);
                fragment.setArguments(args);
                return fragment;
            }
    
            public MapTabFragment() {
            }
    
            @Override
            public void onResume() {
                super.onResume();
    
                Log.d("MyMap", "onResume");
                setUpMapIfNeeded();
            }
    
            private void setUpMapIfNeeded() {
    
                if (mMap == null) {
    
                    Log.d("MyMap", "setUpMapIfNeeded");
    
                    getMapAsync(this);
                }
            }
    
            @Override
            public void onMapReady(GoogleMap googleMap) {
                Log.d("MyMap", "onMapReady");
                mMap = googleMap;
                setUpMap();
            }
    
            private void setUpMap() {
    
                mMap.setMyLocationEnabled(true);
                mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
                mMap.getUiSettings().setMapToolbarEnabled(false);
    
    
                mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    
                    @Override
                    public void onMapClick(LatLng point) {
    
                        Log.d("MyMap", "MapClick");
    
                        //remove previously placed Marker
                        if (marker != null) {
                            marker.remove();
                        }
    
                        //place marker where user just clicked
                        marker = mMap.addMarker(new MarkerOptions().position(point).title("Marker")
                                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));
    
                        Log.d("MyMap", "MapClick After Add Marker");
    
                    }
                });
    
            }
        }
    }
    

提交回复
热议问题