2016-05-21 2 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; 
} 

основной фрагмент GMAP добавляется на OnCreate активности и одежды заменяются на OnItemSelected(). большое спасибо!

ответ

0

Это выглядит как в onNavigationItemSelected вы создаете новые фрагменты каждый раз. Я думаю, что вы хотите сделать следующее:

  1. Сначала проверьте, есть ли у вас фрагмент. Это можно сделать, используя findFragmentByTag() в менеджере фрагментов.
  2. Если она возвращает значение ноль, то вы еще не создали фрагмент еще в этом случае вы создаете новый фрагмент, а затем добавить его с некоторыми тегом (тот, который вы будете использовать, чтобы найти его, когда вы звоните findFragmentByTag() в следующий раз).

  3. Если он существует, вы можете заменить текущий фрагмент на найденный вами .

При создании фрагмента, в методе OnCreate, вы также можете позвонить S etRetainInstance(true)

0

Если ваши фрагменты не должны обновляться в каждом пункте меню, вы можете попытаться сохранить объекты фрагмента в Карте и попытаться получить его при событии клика элемента меню. Но я не знаю, является ли это хорошей практикой.

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