Android:在viewpager片段中重新使用SupportMap片段以保持完整状态

Android:在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时,我不得不重新构造代码。我对碎片缺乏经验,因此问题可能就在那里,尽管地图的缩

我有一个使用actionbarsherlock和google地图的应用程序。我在应用程序中有3个主要选项卡,当您导航两个选项卡时,第一个选项卡将被销毁。我将setOffscreenPageLimit()设置为2,但我希望正确解决此问题,有时当用户返回地图视图时,地图为空且无响应。我将这些片段保存在actionbar活动中的一个数组中,以防止它们被破坏。以前版本的GooglePlay曾使用过这些片段,但在迁移到7.0.0时,我不得不重新构造代码。我对碎片缺乏经验,因此问题可能就在那里,尽管地图的缩放和位置保持不变,其他什么都没有(选项、标记等)

我的代码如下:

编辑:

当我回来时,地图会保存我的缩放和我查看的位置,但侦听器和标记器都不见了。使用地图的任何任务不再连接

//ActionBarActivity.java

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"));
    }
}