2015-04-08 36 views
1

我使用Google SlidingTabLayout和SlidingTabStrip.with在一個片段。 片段主機2其他片段,其中一個具有地圖視圖,另一個具有列表視圖。 如果我第一次從導航抽屜中打開此片段(打開應用程序),它會正確顯示帶有2個選項卡的片段。滑動標籤不能正確加載第二次

但是,當我嘗試通過導航抽屜或通過後退按鈕返回,片段不加載任何東西,只有像slidinglayout灰色背景沒有正確加載。

任何人都可以指出我做錯了什麼?

StoreTabHostFragment.java

public class StoreTabHostFragment extends Fragment { 
    private ViewPager viewPager; 
    private StoresPagerAdapter mAdapter; 
    private SlidingTabLayout tabLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_stores, container, false); 
     viewPager = (ViewPager) rootView.findViewById(R.id.pager); 
     mAdapter = new StoresPagerAdapter(getActivity().getSupportFragmentManager(), getActivity()); 
     viewPager.setAdapter(mAdapter); 
     tabLayout = (SlidingTabLayout) rootView.findViewById(R.id.sliding_tabs); 
     tabLayout.setDistributeEvenly(true); 
     tabLayout.setViewPager(viewPager); 

     return rootView; 
    } 

} 

StoreMapFragment.java(省略了一些功能)

public class StoreMapFragment extends Fragment implements LocationListener,OnMapReadyCallback { 
    private GoogleMap mMap; 
    private MapView mMapView; 
    private Bundle mBundle = new Bundle(); 
    private Double currentLng = -99.274643; 
    private Double currentLat = 19.360460; 
    private LocationManager locationManager; 
    private String provider; 
    private CameraPosition cameraPosition; 
    private SharedPreferences sharedPreferences; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mBundle = savedInstanceState; 
     sharedPreferences = getActivity().getSharedPreferences(Constants.SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); 
    } 


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

     View rootView = inflater.inflate(R.layout.fragment_store_map, container, false); 
     try{ 
      MapsInitializer.initialize(getActivity()); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     mMapView = (MapView) rootView.findViewById(R.id.map); 
     mMapView.onCreate(mBundle); 
     mMapView.getMapAsync(this); 
     //setUpMapIfNeeded(rootView); 
     return rootView; 
    } 
    private void addMarker(GoogleMap map, MFinderStore store){ 
     map.addMarker(new MarkerOptions().position(new LatLng(Double.valueOf(store.lat), Double.valueOf(store.lng))) 
       .title(store.storeName) 
       .snippet(store.storeAddress) 
       .icon(BitmapDescriptorFactory.fromResource(R.drawable.map_marker))); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     googleMap.addMarker(new MarkerOptions().position(new LatLng(currentLat, currentLng)).title(getString(R.string.your_position))); 
     cameraPosition = new CameraPosition.Builder().target(new LatLng(currentLat, currentLng)).zoom(14).build(); 
     googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
     getStoreList(googleMap); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mMapView.onResume(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     mMapView.onPause(); 
     //cameraPosition = mMap.getCameraPosition(); 
    } 

    @Override 
    public void onDestroy() { 
     mMapView.onDestroy(); 
     super.onDestroy(); 
    } 

} 

StorePagerAdapter.java

public class StoresPagerAdapter extends FragmentPagerAdapter { 
    private static int FRAGMENT_NUMBER = 2; 
    private Context context; 
    private String tabTitles[] = new String[] {"Mapa", "Sucursales"}; 

    public StoresPagerAdapter(FragmentManager fm, Context context){ 
     super(fm); 
     this.context = context; 
    } 
    @Override 
    public Fragment getItem(int index){ 
     switch(index){ 
      case 0: 
       return new StoreMapFragment(); 
      case 1: 
       return new StoreListFragment(); 
     } 
     return null; 
    } 
    @Override 
    public int getCount() { 
     // get item count - equal to number of tabs 
     return FRAGMENT_NUMBER; 
    } 
    @Override 
    public CharSequence getPageTitle(int position){ 
     return tabTitles[position]; 
    } 

} 

回答

2

使用FragmentStatePagerAdapter,而不是使用FragmentPagerAdapter這將解決這個問題

1

FragmentPagerAdapter

這代表一個固定的,少量的頁面兄弟屏幕之間導航時是最好的。

FragmentStatePagerAdapter

這是最好的分頁跨越對象的集合,它的頁面數量是不確定的。它會在用戶導航到其他頁面時破壞碎片,從而最大限度地減少內存使用量。

要解決您的問題,請使用FragmentStatePagerAdapter

相關問題