0

Ich bekomme ein Problem in Navigation drawer, wenn ich mehr als ein Mal auf eine Schublade Artikel klicken (Beispiel 5 mal), dann auf drücken, ich bekomme 5 Mal gleichen Fragment.Zurück Handhabung in Fragment bei der Verwendung von Navigation DrawerLayout

Nehmen wir zuerst an hatte ich auf Fragment man dann 5-mal klicken Sie fragment zwei dann nach dem Einschalten Zurück Handhabung oder auf Zurück Gedrückt ersten 5mal zweiten fragment aufgerufen wurde und die die fragment ein.

Ich möchte, dass wenn die gleiche nicht. Ich habe mehrere Male geklickt, ohne es auf den Stack zu schieben.

Wie geht das?

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener,HomeListFragment.MyListFragmentListener { 

    private Stack<Fragment> fragmentStack; 
    private FragmentManager fragmentManager; 
    private HomeListFragment homeListFragment; 
    private ResultListFragment resultListFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     /* FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     });*/ 

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


     fragmentStack = new Stack<Fragment>(); 

     homeListFragment = new HomeListFragment(); 
     homeListFragment.registerForListener(this); 

     fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction ft = fragmentManager.beginTransaction(); 
     ft.add(R.id.container, homeListFragment); 
     fragmentStack.push(homeListFragment); 
     ft.commit(); 


    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      if (fragmentStack.size() >1) { 
       FragmentTransaction ft = fragmentManager.beginTransaction(); 
       fragmentStack.lastElement().onPause(); 
       ft.remove(fragmentStack.pop()); 
       fragmentStack.lastElement().onResume(); 
       ft.show(fragmentStack.lastElement()); 
       ft.commit(); 
      } 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, 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); 
    } 

    @Override 
    public void onItemClickedListener(String valueClicked) { 
     Toast.makeText(this, valueClicked, Toast.LENGTH_LONG).show(); 

     FragmentTransaction ft = fragmentManager.beginTransaction(); 

     resultListFragment = new ResultListFragment(); 
     ft.add(R.id.container, resultListFragment); 
     fragmentStack.lastElement().onPause(); 
     ft.hide(fragmentStack.lastElement()); 
     fragmentStack.push(resultListFragment); 
     ft.commit(); 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.nav_camera) { 
      FragmentTransaction ft = fragmentManager.beginTransaction(); 

      One one = new One(); 
      ft.replace(R.id.container, one,"One"); 
      fragmentStack.lastElement().onPause(); 
      ft.hide(fragmentStack.lastElement()); 
      fragmentStack.push(one); 
      ft.commit(); 
     } else if (id == R.id.nav_gallery) { 
      FragmentTransaction ft = fragmentManager.beginTransaction(); 

      Two two = new Two(); 
      ft.replace(R.id.container, two,"Two"); 
      fragmentStack.lastElement().onPause(); 
      ft.hide(fragmentStack.lastElement()); 
      fragmentStack.push(two); 
      ft.commit(); 
     } else if (id == R.id.nav_slideshow) { 
      FragmentTransaction ft = fragmentManager.beginTransaction(); 

      Three three = new Three(); 
      ft.replace(R.id.container, three,"Three"); 
      fragmentStack.lastElement().onPause(); 
      ft.hide(fragmentStack.lastElement()); 
      fragmentStack.push(three); 
      ft.commit(); 
     } else if (id == R.id.nav_manage) { 
      FragmentTransaction ft = fragmentManager.beginTransaction(); 

      Four four = new Four(); 
      ft.replace(R.id.container, four,"Four"); 
      fragmentStack.lastElement().onPause(); 
      ft.hide(fragmentStack.lastElement()); 
      fragmentStack.push(four); 
      ft.commit(); 

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

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

     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 

Bitte Hilfe

Antwort

0

// Sie verwenden Backstack die vorherigen Fragmente das Fragment alle Stacks unter Code

 One one = new One(); 
     ft.replace(R.id.container, one,"One"); 
     ft.commit(); 

oder Sie können in backPress Verfahren entfernen zu halten verwenden

getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
0

Sie können einfach prüfen, ob die aktuelle Fragmentinstanz existiert oder nicht. Überprüfen Sie, ob das Fragment existiert oder nicht, und machen Sie dann Ihre Logik.

Fragment fragment = getFragmentManager().findFragmentByTag("yourstringtag"); 
     if (fragment instanceof yourFragment) { 
      // No need to commit new one 
     } else { 
      // Commit new one 
     } 

Eine weitere einfache Methode zur Lösung dieses Problems mithilfe einer currentFragment-Instanz. Bitte betrachten Sie dies als Beispiellogik, ich habe es nicht überprüft.

private Fragment mFragment; 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 

    if (id == R.id.nav_camera) { 

     if (!(mFragment instanceof One)) { 
      FragmentTransaction ft = fragmentManager.beginTransaction(); 

      One one = new One(); 
      ft.replace(R.id.container, one, "One"); 
      fragmentStack.lastElement().onPause(); 
      ft.hide(fragmentStack.lastElement()); 
      fragmentStack.push(one); 
      mFragment = one; 
      ft.commit(); 
     } 

    } 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 
+0

Hier im Ort auf yourFragment was i @ Alex Chengalan passieren müssen –

+0

seine auf Fragmente abhängt, für zB: innen 'if (id == R.id.nav_camera)' yourFragment = Eins, und yourstringtag ist "Eins" –

+0

Inkompatible Typen. erforderlich: android.support.v4.app.Fragment Gefunden: android.app.Fragment –

Verwandte Themen