Jak obsługiwać przycisk Wstecz w działaniu

136

Jak obsługiwać przycisk Wstecz w działaniu? Mam kilka przycisków. Jeśli kliknę jeden z przycisków, przekierowuje do przycisków, których potrzebowałem. Działa dobrze, ale kiedy naciskam przycisk Wstecz, kończy się.

Jak rozwiązać ten problem. Mam tylko jedno działanie dla wszystkich tych przycisków. Z góry dziękuję.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    {
        return false; //I have tried here true also
    }
    return super.onKeyDown(keyCode, event);
}

Użyłem powyższego kodu do obsługi przycisku Wstecz, ale nie działa. Kiedy naciskam przycisk Wstecz, uderza tam sam.

Shekhar
źródło

Odpowiedzi:

326

Możesz sobie z tym poradzić w ten sposób:

dla poziomu API 5 i nowszych

@Override
public void onBackPressed() {
    // your code.
}

starsze niż API 5

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // your code
        return true;
    }

    return super.onKeyDown(keyCode, event);
}
Saurabh Pareek
źródło
6
A co we fragmentach?
crushman
1
Tak, czy ktoś wie jak to zrobić z fragmentu
James Wierzba
3
@ james-wierzba hand in activity and delegate processing to a fragment
Grigorii Chudnov
19

Oprócz powyższego osobiście polecam

onKeyUp():

Programowo Mówiąc keyDown będzie ognia, gdy użytkownik naciśnie klawisz początkowo ale to będzie powtórzyć, gdy użytkownik trzyma klucz depresji.*

Dotyczy to wszystkich platform programistycznych.

Rozwój Google zasugerował, że jeśli przechwytujesz przycisk WSTECZ w widoku, powinieneś śledzić KeyEvent ze starttrackingiem w keydown, a następnie wywołać z keyup.

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK
            && event.getRepeatCount() == 0) {
        event.startTracking();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
            && !event.isCanceled()) {
        // *** Your Code ***
        return true;
    }
    return super.onKeyUp(keyCode, event);
}
Richard Sites
źródło
15

Zarówno w przypadku przycisku powrotu urządzenia sprzętowego, jak i przycisku soft home (wstecz), np. „<-” to działa u mnie. (* Uwaga: w działaniu mam pasek aplikacji / pasek narzędzi)

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



@Override
public void onBackPressed() {
   //Execute your code here
   finish();

}

Twoje zdrowie!

S bruce
źródło
Użyłem wykończenia i nie wraca do poprzedniej czynności.
Si8
2
„finish ()” zamyka tylko bieżącą aktywność. Musisz poradzić sobie z powrotem do poprzedniej aktywności, używając zamiaru. Przy okazji, Twoja poprzednia czynność powinna być nadal otwarta, jeśli nie wykonałeś jej „finish ()” podczas nawigacji z niej wcześniej.
S bruce
Testuję coś i zaktualizuję. Dzięki za odpowiedzi.
Si8
1
Po prostu użyj super.onBackPressed () zamiast finish ()
b00n12
9

Prostszym podejściem jest przechwycenie naciśnięcia przycisku Wstecz i wywołania metody moveTaskToBack (true) w następujący sposób:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

W systemie Android 2.0 wprowadzono nową metodę onBackPressed i te zalecenia dotyczące obsługi przycisku Wstecz

Umesh K.
źródło
9

Powinieneś użyć:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
            && keyCode == KeyEvent.KEYCODE_BACK
            && event.getRepeatCount() == 0) {
        // Take care of calling this method on earlier versions of
        // the platform where it doesn't exist.
        onBackPressed();
    }

    return super.onKeyDown(keyCode, event);
}

@Override
public void onBackPressed() {
    // This will be called either automatically for you on 2.0
    // or later, or by the code above on earlier versions of the
    // platform.
    return;
}

Zgodnie z definicją tutaj: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html

Jeśli używasz starszej wersji do kompilacji kodu, zamień android.os.Build.VERSION_CODES.ECLAIR na 5 (możesz na przykład dodać prywatny int o nazwie ECLAIR)

neteinstein
źródło
1

To mi pomogło ...

@Override
public void onBackPressed() {
    startActivity(new Intent(currentActivity.this, LastActivity.class));
    finish();
}

LUB????? nawet możesz użyć tego również do przełączania szuflady

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
        startActivity(new Intent(currentActivity.this, LastActivity.class));
    finish();

}

Mam nadzieję, że to Ci pomoże .. :)

Shubham
źródło
1

To prosty sposób na zrobienie czegoś.

    @Override
        public void onBackPressed() {
            // do what you want to do when the "back" button is pressed.
            startActivity(new Intent(Activity.this, MainActivity.class));
            finish();
        }

Myślę, że mogą być bardziej wyszukane sposoby na zrobienie tego, ale lubię prostotę. Na przykład, użyłem powyższego szablonu, aby wylogować użytkownika z aplikacji, A NASTĘPNIE powrócić do innej wybranej przeze mnie czynności.

Eddie Towers
źródło