Reputation: 11506
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.
Upvotes: 3
Views: 9170
Reputation: 41129
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;
}
Upvotes: 1