Cách xử lý nút quay lại trong hoạt động


136

Làm thế nào để xử lý một nút quay lại trong một hoạt động? Tôi có một số nút. Nếu tôi nhấp vào một trong các nút, nó sẽ chuyển hướng đến các nút mà tôi yêu cầu. Nó hoạt động tốt nhưng khi tôi nhấn nút quay lại thì nó đã hoàn thành.

Làm thế nào để giải quyết vấn đề này. Tôi chỉ có một hoạt động cho tất cả các nút. Cảm ơn trước.

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

Tôi đã sử dụng mã ở trên để xử lý nút quay lại nhưng nó không hoạt động. Khi tôi nhấn nút quay lại, nó tự đánh vào đó.

Câu trả lời:


326

Bạn có thể xử lý nó như thế này:

cho API cấp 5 trở lên

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

cũ hơn API 5

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

    return super.onKeyDown(keyCode, event);
}

6
Còn về những mảnh vỡ thì sao?
nghiền nát

1
Vâng, có ai biết làm thế nào từ một mảnh
James Wierzba 6/12/2015

3
@ james-wierzba xử lý trong hoạt động và ủy thác xử lý cho một đoạn
Grigorii Chudnov

19

Ngoài những điều trên, cá nhân tôi khuyên bạn nên

onKeyUp():

Phím tắt nói theo lập trình sẽ kích hoạt khi người dùng ấn phím ban đầu nhưngsẽ lặp lại trong khi người dùng giữ phím đó. *

Điều này vẫn đúng cho tất cả các nền tảng phát triển.

Phát triển của Google đề xuất rằng nếu bạn chặn nút BACK trong chế độ xem, bạn nên theo dõi KeyEvent bằng cách bắt đầu khi gõ phím, sau đó gọi bằng 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);
}

15

Đối với cả nút quay lại của thiết bị phần cứng và nút home mềm (trở lại), ví dụ: "<-" đây là những gì phù hợp với tôi. (* Lưu ý Tôi có một thanh ứng dụng / thanh công cụ trong hoạt động)

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

}

Chúc mừng!


Tôi đã sử dụng kết thúc và nó không quay trở lại hoạt động trước đó.
Si8

2
"finish ()" chỉ đóng hoạt động hiện tại của bạn. Bạn cần xử lý việc quay lại hoạt động trước đó bằng cách sử dụng ý định. Btw, hoạt động trước đó của bạn vẫn phải mở nếu bạn không "kết thúc ()" khi điều hướng từ đó trước đó.
S bruce

Tôi đang thử nghiệm một cái gì đó và sẽ cập nhật cho bạn. Cảm ơn vì sự trả lời.
Si8

1
Chỉ cần sử dụng super.onBackPression () thay vì kết thúc ()
b00n12

9

Một cách tiếp cận đơn giản hơn là chụp nút Quay lại và gọi moveTaskToBack (đúng) như sau:

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

Android 2.0 đã giới thiệu một phương thức onBackPression mới và những đề xuất này về cách xử lý nút Quay lại


9

Bạn nên sử dụng:

@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;
}

Như được định nghĩa ở đây: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html

Nếu bạn đang sử dụng phiên bản cũ hơn để biên dịch mã, hãy thay thế android.os.Build.VERSION_CODES.ECLAIR bằng 5 (ví dụ: bạn có thể thêm một int riêng có tên ECLAIR)


1

Điều này đã giúp tôi ..

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

HOẶC LÀ????? thậm chí bạn có thể sử dụng điều này cho ngăn kéo chuyển đổi cũng

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

}

Tôi hy vọng điều này sẽ giúp bạn .. :)


1

Đây là một cách đơn giản để làm một cái gì đó.

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

Tôi nghĩ rằng có thể có nhiều cách phức tạp hơn để đi về nó, nhưng tôi thích sự đơn giản. Ví dụ: tôi đã sử dụng mẫu ở trên để khiến người dùng đăng xuất khỏi ứng dụng VÀ THÌ quay lại hoạt động khác mà tôi chọn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.