2016-04-18 10 views
0

Ich habe eine Aktivität, die ein Fragment onCreate lädt. Und ich habe eine Toolbar für diese Aktivität, die eine Schaltfläche hat, die, wenn sie angeklickt wird, ein neues Fragment über demjenigen, das zuerst erstellt wurde, hinzufügt.Symbolleisten-Zurück-Schaltfläche schließt nicht aktuelles Fragment

Jetzt auf dieser Symbolleiste, wenn ich klicke, möchte ich das neuere Fragment entfernen, so dass es nur das Fragment, das in der unteren (älteren) ist, verschiebt. Ich habe gesucht und ich habe es bis auf eine Sache herausgefunden.

Ich tat dies, so dass es zu sehen versucht, wenn die Symbolleiste Taste gedrückt wird:

@Override 
    public boolean onKeyUp(int keyCode, KeyEvent objEvent) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      onBackPressed(); 
      return true; 
     } 
     return super.onKeyUp(keyCode, objEvent); 
    } 


@Override 
    public void onBackPressed() { 
     FragmentManager mFM = getSupportFragmentManager(); 
     if(mFM.findFragmentByTag("NewFragment") != null){ 
      mFM.beginTransaction().remove(mFM.findFragmentByTag("NewFragment")).commit(); 
     } 
    } 

Das Problem ist, „keyCode“ gleich ist nur KEYCODE_BACK, wenn Sie die „Zurück-Button Hardware“ klicken und nicht die Zurück-Schaltfläche der Symbolleiste. Was es mir gibt ist Keycode 58 und nicht 4 (KEYCODE_BACK).

+0

warum mit '58' keycode .. so etwas wie' if (keyCode eine 'or' Anweisung nicht hinzufügen = = KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.XY) ... ' – user0815

Antwort

0

glaube ich, was Sie suchen die NavigationListener für die Toolbar Widget ist:

mToolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onBackPressed(); 
     } 
    }); 

aber wenn Sie ein Thema mit einem ActionBar mit und Einstellung ein supportActionBar dann etwas tun:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()){ 
     case android.R.id.home: 
      onBackPressed(); 
      break; 
    } 
    return true; 
} 
+0

das hat funktioniert. Vielen Dank! – gdubs

0

Es ist nicht klar aus Ihrer Frage, ob Sie eine Fragment-Management-Frage (FragmentTransaction remove vs. replace) oder eine Toolbar-Schaltfläche Frage stellen. Ich gehe davon aus das letztere ...

Ein Android-Toolbar oder ActionBar sollten Aktionen behandelt haben mit:

@Override 
public Boolean onOptionsItemSelected(MenuItem item) 
{ 
switch (item.getItemId()) 
{ 
    case MY_BACK_BUTTON: 
    myBackPressedHandler(); 
    return (true); 
} 
return (false); 
} 

dies setzt voraus, dass Ihr Back-Taste als MenuItem hinzugefügt und wurde eine ID von MY_BACK_BUTTON gegeben.

Für eine Toolbar können Sie eine MenuItemClickListener verwenden, um die Click-Ereignisse zu behandeln:

mToolbar.setOnMenuItemClickListener(MenuItem menuItem) 
{ 
@Override 
public Boolean onMenuItemClick(MenuItem menuItem) 
{ 
    // call onOptionsItemSelected, or handle the click here directly 
    return (thisFragment.onOptionsItemSelected(menuItem)); 
} 
}); 

Wenn Sie die "Up" -Taste auf der Symbolleiste/ActionBar sich beziehen, dh setDisplayHomeAsUpEnabled (true), das eine GetItemID haben() von android.R.id.home und in ähnlicher Weise gehandhabt werden können:

case android.R.id.home: 
    myBackPressedHandler(); 
    return (true);