Nesting Google Map fragment inside custom Fragment

Michael IV

I am trying to create swipe views with fragments.One of the fragments should wrap GoogleMap MapFragment.Inflating MapFragment directly in main activity works ok.But doing via FragmentPagerAdapter throws source not found in Choreographer.class .I can't find a clue why it happens.I set it all up based on this answer .So my code looks like this:

MainActivity

public class MainActivity extends FragmentActivity {

FragPagerAdapter _fragPagerAdapter;
ViewPager _viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);

    _fragPagerAdapter = new FragPagerAdapter(getFragmentManager());
    _viewPager = (ViewPager)findViewById(R.id.pager);
    _viewPager.setAdapter(_fragPagerAdapter);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);

    return true;
}

public class FragPagerAdapter extends  FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {

        Fragment fragment = null;

        if(position == 1){
        fragment = new LocMapFragment(); //CRASHES 
        }else{
            //Doesn't contain map .WORKS
            fragment = new DummySectionFragment();
            Bundle args = new Bundle();
            args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
            fragment.setArguments(args);
        }

        return fragment;
    }

    @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;
    }
}


}

LocMapFragment

public class LocMapFragment extends Fragment {

private GoogleMap  _map;
@Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState){

  View v = inflater.inflate(R.layout.map_layout, null, false);

  _map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
      .getMap();

  return v;
   }
}

map_layout layout

<?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

    <fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment" />

 </RelativeLayout>

I am using Fragments from Android API and not from support V4.I tried to change fragment layout to class="com.google.android.gms.maps.SupportMapFragment" and still the same.

UPDATE:

Ok,Somehow it started working now.But what happens now is that if the map fragment is in the first swipe fragment and then I have two more swipes with just text.If I scroll from the map to another and then scroll back ,I am getting exception on Choreographer.class.

This answer seem to have solved the issue.

Emil Adz

Take a look at this implementation, you should as you already did, Create a fragment with a map in it:

public class MapFragment extends Fragment

create a layout: mapview.xml:

<?xml version="1.0" encoding="utf-8"?>

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/mapview"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
map:cameraZoom="12"
map:mapType="normal"
map:uiZoomControls="false"
map:uiRotateGestures="true"
map:uiScrollGestures="true"
map:uiZoomGestures="true"
map:uiTiltGestures="false" />

then in the fragment do this:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    return inflater.inflate(R.layout.mapview, container, false);
}

then to get the map instance:

private GoogleMap getGoogleMap() {
        if (map == null && getActivity() != null && getActivity().getSupportFragmentManager()!= null) {
            SupportMapFragment smf = (SupportMapFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.mapview);
            if (smf != null) {
                map = smf.getMap();
            }
        }
        return map;
    }

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related