Android:在viewpager片段中重新使用SupportMap片段以保持完整状态
我有一个使用actionbarsherlock和google地图的应用程序。我在应用程序中有3个主要选项卡,当您导航两个选项卡时,第一个选项卡将被销毁。我将setOffscreenPageLimit()设置为2,但我希望正确解决此问题,有时当用户返回地图视图时,地图为空且无响应。我将这些片段保存在actionbar活动中的一个数组中,以防止它们被破坏。以前版本的GooglePlay曾使用过这些片段,但在迁移到7.0.0时,我不得不重新构造代码。我对碎片缺乏经验,因此问题可能就在那里,尽管地图的缩放和位置保持不变,其他什么都没有(选项、标记等) 我的代码如下: 编辑: 当我回来时,地图会保存我的缩放和我查看的位置,但侦听器和标记器都不见了。使用地图的任何任务不再连接 //ActionBarActivity.javaAndroid:在viewpager片段中重新使用SupportMap片段以保持完整状态,android,google-maps,android-fragments,android-viewpager,google-maps-android-api-2,Android,Google Maps,Android Fragments,Android Viewpager,Google Maps Android Api 2,我有一个使用actionbarsherlock和google地图的应用程序。我在应用程序中有3个主要选项卡,当您导航两个选项卡时,第一个选项卡将被销毁。我将setOffscreenPageLimit()设置为2,但我希望正确解决此问题,有时当用户返回地图视图时,地图为空且无响应。我将这些片段保存在actionbar活动中的一个数组中,以防止它们被破坏。以前版本的GooglePlay曾使用过这些片段,但在迁移到7.0.0时,我不得不重新构造代码。我对碎片缺乏经验,因此问题可能就在那里,尽管地图的缩
public class ActionBarActivity extends SherlockFragmentActivity implements TabListener, OnPageChangeListener {
ViewPager mViewPager;
String pageString = "map_view";
// Holder for the fragments used
List<SherlockFragment> frags;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_action_bar);
mViewPager = (ViewPager) findViewById(R.id.pager);
// *** I would like for the code to work WITHOUT the following line ***
mViewPager.setOffscreenPageLimit(2);
mViewPager.setAdapter(new MyPagerAdapter(this, getSupportFragmentManager()));
// Get Actionbar
ActionBar bar = getSupportActionBar();
// Get tabs
ActionBar.Tab mapTab = bar.newTab()
.setIcon(R.drawable.ic_action_map)
.setTabListener(this)
.setTag("map");
ActionBar.Tab listTab = bar.newTab()
.setIcon(R.drawable.ic_action_view_as_list)
.setTabListener(this)
.setTag("list");
// Get tabs
ActionBar.Tab photoFeedTab = bar.newTab()
.setIcon(R.drawable.ic_action_camera)
.setTabListener(this)
.setTag("photo");
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.addTab(mapTab);
bar.addTab(listTab);
bar.addTab(photoFeedTab);
frags = Arrays.asList(null, null, null);
}
@Override
protected void onResume() {
super.onResume();
mViewPager.setOnPageChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
mViewPager.setOnPageChangeListener(null);
}
private class MyPagerAdapter extends FragmentStatePagerAdapter {
private final String[] mPageTitles;
public MyPagerAdapter(Context context, FragmentManager fm) {
super(fm);
mPageTitles = context.getResources().getStringArray(R.array.pageTitle);
}
@Override
public CharSequence getPageTitle(int position) {
return mPageTitles[position];
}
@Override
public int getCount() {
return mPageTitles.length;
}
@Override
public Fragment getItem(int position) {
Fragment f = null;
switch (position) {
case 0:
pageString = "map_view";
if(frags.get(0) == null) {
ViewMap vm = new ViewMap();
vm.setRetainInstance(true);
frags.set(0, vm);
}
f = frags.get(0);
// pass through the bundle holding lat/long
// to move the camera (if present)
Bundle showData = getIntent().getExtras();
if (showData != null) {
f.setArguments(showData);
}
break;
case 1:
pageString = "list_view";
if(frags.get(1) == null) {
frags.set(1, new ListViewHubba());
}
f = frags.get(1);
break;
case 2:
pageString = "Photo_feed";
if(frags.get(2) == null) {
frags.set(2, new PhotoFeedList());
}
f = frags.get(2);
break;
}
return f;
}
}
public void onPageScrollStateChanged(int arg0) {
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
public void onPageSelected(int position) {
position = position % getSupportActionBar().getNavigationItemCount();
getSupportActionBar().setSelectedNavigationItem(position);
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
mViewPager.setCurrentItem(tab.getPosition());
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
公共类ActionBarActivity扩展了SherlockFragmentActivity实现了TabListener、OnPageChangeListener{
ViewPager mViewPager;
String pageString=“地图视图”;
//所用碎片的支架
列出碎片;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u action\u bar);
mViewPager=(ViewPager)findViewById(R.id.pager);
//***我希望代码在没有以下行的情况下工作***
mViewPager.setOffscreenPageLimit(2);
setAdapter(新的MyPagerAdapter(这个,getSupportFragmentManager());
//获取操作栏
ActionBar=getSupportActionBar();
//获取标签
ActionBar.Tab映射选项卡=bar.newTab()
.setIcon(R.drawable.ic_动作图)
.SetTableListener(此)
.setTag(“地图”);
ActionBar.Tab列表Tab=bar.newTab()
.setIcon(R.drawable.ic\u action\u view\u as\u list)
.SetTableListener(此)
.setTag(“列表”);
//获取标签
ActionBar.Tab photoFeedTab=bar.newTab()
.setIcon(R.drawable.ic_action_camera)
.SetTableListener(此)
.setTag(“照片”);
设置导航模式(操作栏导航模式选项卡);
bar.addTab(mapTab);
bar.addTab(列表选项卡);
条。添加选项卡(photoFeedTab);
frags=Arrays.asList(null,null,null);
}
@凌驾
受保护的void onResume(){
super.onResume();
mViewPager.setOnPageChangeListener(此);
}
@凌驾
受保护的void onPause(){
super.onPause();
mViewPager.setOnPageChangeListener(null);
}
私有类MyPagerAdapter扩展了FragmentStatePagerAdapter{
私有最终字符串[]mPageTitles;
公共MyPagerAdapter(上下文,FragmentManager fm){
超级(fm);
mPageTitles=context.getResources().getStringArray(R.array.pageTitle);
}
@凌驾
公共字符序列getPageTitle(int位置){
返回mPageTitles[位置];
}
@凌驾
public int getCount(){
返回mPageTitles.length;
}
@凌驾
公共片段getItem(int位置){
片段f=null;
开关(位置){
案例0:
pageString=“地图视图”;
if(frags.get(0)=null){
ViewMap vm=新的ViewMap();
vm.setRetainInstance(真);
frags.set(0,vm);
}
f=frags.get(0);
//穿过捆扎物,保持横向/纵向
//移动相机(如果存在)
Bundle showData=getIntent().getExtras();
if(showData!=null){
f、 setArguments(showData);
}
打破
案例1:
pageString=“列表\视图”;
if(frags.get(1)=null){
frags.set(1,新ListViewHubba());
}
f=碎片获取(1);
打破
案例2:
pageString=“Photo_feed”;
if(frags.get(2)=null){
frags.set(2,新的PhotoFeedList());
}
f=碎片获取(2);
打破
}
返回f;
}
}
公共无效onPageScrollStateChanged(int arg0){
}
已滚动页面上的公共void(int arg0、float arg1、int arg2){
}
已选择页面上的公共无效(内部位置){
位置=位置%getSupportActionBar().getNavigationItemCount();
getSupportActionBar().setSelectedNavigationItem(位置);
}
已选择的公共事务(选项卡,碎片事务ft){
setCurrentItem(tab.getPosition());
}
已选择公共空页(选项卡,碎片事务ft){
}
已重新选择公共无效页签(页签,碎片事务){
}
}
//ViewMap.java
public class ViewMap extends SherlockFragment {
public GoogleMap mMap;
private View rootView = null;
Context context;
private View v;
ProgressDialog progressDialog;
boolean fetched = false;
SupportMapFragment fragment;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FragmentManager fm = getChildFragmentManager();
fragment = getMapFragment();
if (fragment == null) {
Log.i("DEBUG", "Fragment was null.");
fragment = SupportMapFragment.newInstance();
fragment.setRetainInstance(true);
fm.beginTransaction().replace(R.id.map_container, fragment).commit();
} else {
Log.i("DEBUG", "Fragment was Not null.");
}
/**
* at this time google play services are not initialize so get map
* and add what ever you want to it in onResume() or onStart()
*/
}
@Override
public void onResume() {
super.onResume();
setupMapIfNeeded();
}
public View onCreateView(final LayoutInflater inflater,
final ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
context = getActivity().getApplicationContext();
if(rootView == null) {
rootView = inflater.inflate(R.layout.view_map_activity, container,
false);
} else {
Log.i("DEBUG", "Non null root view.");
}
return rootView;
}
public void setupMapIfNeeded() {
if (mMap == null) {
mMap = fragment.getMap();
fetched = false;
}
// Check if we were successful in obtaining the map.
// and only reload it if we haven't already fetched
if (mMap != null && !fetched) {
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
isHybrid = false;
mMap.setMyLocationEnabled(true);
// Check if current location is available, otherwise default to riley
LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
LatLng Center;
if (location != null) {
// Get current location info
Center = new LatLng(location.getLatitude(), location.getLongitude());
} else {
// default to riley
Center = new LatLng(42.4409010, -83.3978000);
}
// set camera position
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(Center)
.zoom(CAMERA_ZOOM)
.bearing(0)
.tilt(30)
.build();
mMap.animateCamera(CameraUpdateFactory
.newCameraPosition(cameraPosition));
/**
* Show loading message if first time fetching.
*/
progressDialog = ProgressDialog.show(getActivity(), "",
"Fetching spots...", true);
Spot.getAllSpots(mMap, getActivity().getApplicationContext(), progressDialog);
fetched = true;
//... custom map options here ...
}
}
private SupportMapFragment getMapFragment() {
FragmentManager fm = null;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
Log.i("DEBUG", "using getFragmentManager");
fm = getFragmentManager();
} else {
Log.i("DEBUG", "using getChildFragmentManager");
fm = getChildFragmentManager();
}
return (SupportMapFragment) fm.findFragmentById(R.id.map_container);
}
}
公共类视图映射扩展了SherlockFragment{
公共谷歌地图;
私有视图rootView=null;
语境;
私人观点v;
进行对话进行对话;
boolean fetched=false;
支持MAP片段;
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
FragmentManager fm=getChildFragmentManager();
fragment=getMapFragment();
if(片段==null){
Log.i(“DEBUG”,“Fragment为null”);
fragment=SupportMapFragment.newInstance();
fragment.setRet
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map_view_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map_container">
<!-- The map fragment will go here -->
</RelativeLayout>
</RelativeLayout>
setRetainInstance(true);
/**
* This shows how to retain a map across activity restarts (e.g., from screen rotations), which can
* be faster than relying on state serialization.
*/
public class RetainMapDemoActivity extends FragmentActivity implements OnMapReadyCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.basic_demo);
SupportMapFragment mapFragment =
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
if (savedInstanceState == null) {
// First incarnation of this activity.
mapFragment.setRetainInstance(true);
}
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap map) {
map.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
}
}