2016-05-21 91 views
0

我想實現一個NavigationDrawer與在主活動的幀結構片段。導航抽屜應該在我的「主」片段,GMAP片段和其他片段之間切換。作爲「主要」片段,此活動首次啓動時也會添加此片段(如代碼中所示)。問題是當我替換物品上的碎片時,碎片被破壞,地圖碎片重新被創建。我更希望的片段創建一次,並以某種方式保存其狀態時,我與其他碎片將其裝回佔位片段的交換和生命週期

的頂部,這是地圖片段

public class Mapfragment extends Fragment 
{ 
MapView mMapView; 
private GoogleMap googleMap; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // inflate and return the layout 
    View v = inflater.inflate(R.layout.activity_map_fragment, container, 
      false); 
    mMapView = (MapView) v.findViewById(R.id.mapView); 
    mMapView.onCreate(savedInstanceState); 

    mMapView.onResume();// needed to get the map to display immediately 

    try { 
     MapsInitializer.initialize(getActivity().getApplicationContext()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    Camera camera = UserDetails.getInstance().getCameras().get(0); 

    googleMap = mMapView.getMap(); 
    // latitude and longitude 
    double latitude = camera.getLatitude(); 
    double longitude = camera.getLongitude(); 

    // create marker 
    MarkerOptions marker = new MarkerOptions().position(
      new LatLng(latitude, longitude)).title("Hello Maps"); 

    // Changing marker icon 
    marker.icon(BitmapDescriptorFactory 
      .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); 

    // adding marker 
    googleMap.addMarker(marker); 
    CameraPosition cameraPosition = new CameraPosition.Builder() 
      .target(new LatLng(camera.getLatitude(), camera.getLongitude())).zoom(18).build(); 
    googleMap.animateCamera(CameraUpdateFactory 
      .newCameraPosition(cameraPosition)); 

    // Perform any camera updates here 
    return v; 
}@Override 
public void onResume() { 
super.onResume(); 
Log.d("Map fragment Resumed", "sdfsdf"); 
mMapView.onResume(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    Log.d("Map fragment paused","dsffs"); 
    mMapView.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.d("Map fragment Destroyed", "sdfsdf"); 
    mMapView.onDestroy(); 
} 

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

}

主要活動

公共類Main_screen擴展AppCompatActivity 實現導航View.OnNavigationItemSelectedListener {

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main_screen); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    Fragment fragment = new Mapfragment(); 




    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 
    View hView = navigationView.getHeaderView(0); 
    TextView username_header = (TextView)hView.findViewById(R.id.username_header); 
    username_header.setText(UserDetails.getInstance().getUsername()); 
    ImageView img= (ImageView)hView.findViewById(R.id.imageView); 
    img.setImageBitmap(UserDetails.getInstance().getImage()); 
      //adding main fragment upon Main screen activity Oncreate 
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().add(R.id.frame_layout_placeholder,fragment).commit(); 





} 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 

@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_screen, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    android.support.v4.app.Fragment fragment = null; 
    android.support.v4.app.FragmentTransaction fragmentManager = getSupportFragmentManager().beginTransaction(); 

    int id = item.getItemId(); 

    if (id == R.id.map_frag_item) { 
     fragment = new Mapfragment(); 
    } else if (id == R.id.nav_gallery) { 
     fragment = new FragmentTwo(); 

    } else if (id == R.id.nav_slideshow) { 

    } else if (id == R.id.nav_manage) { 
    } else if (id == R.id.nav_share) { 

    } else if (id == R.id.nav_send) { 

    } 

    fragmentManager.replace(R.id.frame_layout_placeholder, fragment).commit(); 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 

正在上的活動的OnCreate加入主GMAP片段和衣服被在OnItemSelected()取代。 非常感謝!

回答

0

它看起來像在onNavigationItemSelected要創建新的片段各一次。我認爲你想要做的是這樣的:

  1. 首先檢查你是否已經有一個片段。這可以在片段管理器上使用 findFragmentByTag()完成。
  2. 如果返回null,則您尚未創建片段然而,在 創建這種情況下,新的片段,然後用一些 標籤(你會用它來尋找它,當你調用 findFragmentByTag()的一個添加它下次)。

  3. 如果確實存在,那麼你可以用 一個你找到替換當前的片段。

當您創建的片段,在onCreate方法,你可能也想稱S etRetainInstance(true)

0

如果你的碎片不會對每個菜單項進行更新點擊你可以嘗試存儲在一個Map片段對象,並嘗試在菜單項單擊事件進行檢索。但我不知道它是否是一種好的做法。

public boolean onNavigationItemSelected(MenuItem item) { 
// Handle navigation view item clicks here. 
android.support.v4.app.Fragment fragment = null; 
android.support.v4.app.FragmentTransaction fragmentManager = getSupportFragmentManager().beginTransaction(); 

int id = item.getItemId(); 
if(myFragmentMap.contains(id) && myFragmentMap.get(new Integer(id))!=null){ 
    fragment=myFragmentMap.get(new Integer(id)); 
    return true; 
} 
if(myFragmentMap==null)myFragmentMap=new HashMap<>(); 
if (id == R.id.map_frag_item) { 
    fragment = new Mapfragment(); 
    myFragmentMap.put(id,fragment); 
} else if (id == R.id.nav_gallery) { 


} else if (id == R.id.nav_slideshow) { 

} else if (id == R.id.nav_manage) { 
} else if (id == R.id.nav_share) { 

} else if (id == R.id.nav_send) { 

} 

fragmentManager.replace(R.id.frame_layout_placeholder, fragment).commit(); 
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
drawer.closeDrawer(GravityCompat.START); 
return true; 
} 

聲明myFragmentMap;

你必須將其聲明爲類變量

public class MyFragment extends Fragment{ 
    static HashMap myFragmentMap; 

    //onCreateView Method and the rest 
} 
+0

Malith嗨,這裏定義myFragmentMap?它是什麼類型? – Tomb