我正在尝试使用片段创建滑动视图。其中一个片段应该包装GoogleMap MapFragment.Inflating MapFragment直接在main活动中正常工作。但是通过FragmentPagerAdapter执行会抛出Choreographer.class中找不到的源。我不能这样做找到它为什么会发生的线索。我根据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布局
<?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>
我正在使用来自Android API的片段,而不是来自支持V4.我试图将片段布局更改为class =&#34; com.google.android.gms.maps.SupportMapFragment&#34;并且仍然是一样的。
更新
好吧,不知怎的,它现在开始工作了。但是现在发生的事情是,如果地图片段在第一个滑动片段中,然后我还有两个只有文本的滑动。如果我从地图滚动到另一个,然后向后滚动,我在Choreographer.class上得到例外。
答案 0 :(得分:1)
看看这个实现,您应该像以前一样,创建一个包含地图的片段:
public class MapFragment extends Fragment
创建一个布局: 的 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" />
然后在片段中执行此操作:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.mapview, container, false);
}
然后获取地图实例:
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;
}