Share Button
Back Và Các Phím Cứng Khác Với Ba Câu Chuyện
09
September
2013

Android 2.0 giới thiệu hành vi mới và hỗ trợ cho việc xử lý các phím cứng như BACKMENU , bao gồm một số tính năng đặc biệt để hỗ trợ các phím cứng ảo sẽ xuất hiện trên các thiết bị gần đây như Droid. Giống như việc ứng dụng thực đơn vào thiết bị di động.

Hãy cùng trung tâm đào tạo khóa học học lập trình di động tại đà nẵng xem các câu chuyện vui bởi sự khỏi đầu của nó!

Bài viết này sẽ cung cấp cho bạn ba câu chuyện về những thay đổi: từ đơn giản nhất để các chi tiết đẫm máu. Chọn một trong những thông tin bạn thích.

Câu chuyện 1: Làm dễ dàng hơn cho các nhà phát triển

Nếu bạn đã khảo sát các ứng dụng cơ bản trong nền tảng Android, bạn sẽ nhận thấy một mô hình khá phổ biến: thêm một chút ma thuật để đánh chặn các BACK quan trọng và làm một cái gì đó khác nhau. Để làm điều này đúng, sự kỳ diệu cần nhìn một cái gì đó như thế này:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

Làm thế nào để đánh chặn các BACK quan trọng trong một hoạt động cũng là một trong những câu hỏi phổ biến mà chúng ta thấy các nhà phát triển yêu cầu, vì vậy như là 2.0, chúng tôi có một chút API mới để làm cho đơn giản hơn và dễ dàng hơn để phát hiện và có được quyền:

@Override

public void onBackPressed() {

// do something on back.

return;

}

Nếu điều này khi  tất cả các bạn quan tâm về việc làm, và bạn không phải lo lắng về việc hỗ trợ các phiên bản của các nền tảng trước 2.0, sau đó bạn có thể dừng lại ở đây. Nếu không, hãy đọc tiếp.

Câu chuyện 2: Nhấn giữ phím lâu:

Một trong những bổ sung khá muộn để nền tảng Android là việc sử dụng Nhấn giữ phím lâu trên các phím cứng để thực hiện hành động khác nhau. Trong 1.0 này được dài bấm trên HOME cho các ứng dụng bộ chuyển đổi gần đây và Nhấn giữ phím lâu dài trên CALL cho trình quay số bằng giọng nói. Trong 1,1 chúng tôi giới thiệu báo chí dài trên TÌM KIẾM cho tìm kiếm bằng giọng nói, và 1.5 giới thiệu báo chí dài trên MENU để buộc các bàn phím mềm được hiển thị như một tính năng tương thích ngược với các ứng dụng mà vẫn chưa IME nhận thức.

(Với phương thức: Nhấn giữ dài trên MENU chỉ dành cho tương thích ngược, và do đó có một số hành vi có lẽ đáng ngạc nhiên trong cách mạnh mẽ bàn phím mềm vẫn lên khi nó được sử dụng này không có ý định là một cách tiêu chuẩn để truy cập vào bàn phím mềm. , và tất cả các ứng dụng được viết hôm nay cần phải có một cách tiêu chuẩn hơn và có thể nhìn thấy để đưa lên bộ gõ nếu cần.)

Thật không may là quá trình tiến hóa của tính năng này dẫn đến một ít hơn thực hiện tối ưu: tất cả các Nhấn giữ phím lâu phát hiện lâu đã được thực hiện trong mặc định chính xử lý mã khung phía khách hàng của, sử dụng tin nhắn đúng lúc. Điều này dẫn đến rất nhiều sao chép mã và một số vấn đề hành vi, kể từ khi mã phái sự kiện thực tế không có khái niệm ép dài và tất cả thời gian cho họ đã được thực hiện trên các chủ đề chính của ứng dụng, các ứng dụng có thể được làm chậm, đủ để không cập nhật trong thời gian chờ Nhấn giữ phím lâu.

Trong Android 2.0 này tất cả thay đổi, với một thực API KeyEvent và chức năng gọi lại cho máy ép lâu. Những đơn giản hóa việc xử lý báo chí dài cho các ứng dụng, và cho phép họ tương tác một cách chính xác với khuôn khổ. Ví dụ: bạn có thể ghi đè lênActivity.onKeyLongPress () để cung cấp cho hành động của riêng bạn cho một báo dài trên một trong các phím cứng, trọng hành động mặc định được cung cấp bởi khuôn khổ.

Có lẽ quan trọng nhất cho các nhà phát triển là một sự thay đổi tương ứng trong ngữ nghĩa của phím BACK. Trước đây việc xử lý chính mặc định thực hiện các hành động quan trọng này khi nó được ép, không giống như các phím cứng khác. Trong 2,0 phím LẠI giờ được thực hiện trên chính lên. Tuy nhiên, đối với các ứng dụng hiện có, khuôn khổ sẽ tiếp tục thực hiện hành động trên phím xuống vì lý do tương thích. Để kích hoạt các hành vi mới trong ứng dụng của bạn, bạn phải thiết lập Android: targetSdkVersion trong biểu hiện của bạn để 5 hoặc cao hơn.

Dưới đây là một ví dụ về mã một phân lớp Hoạt động có thể sử dụng để thực hiện các hành động đặc biệt cho một nền Nhấn giữ phím lâu và Nhấn giữ phím ngắn của CALL chính:

@Override

public boolean onKeyLongPress(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_CALL) {

        // a long press of the call key.

        // do our work, returning true to consume it.  by

        // returning true, the framework knows an action has

        // been performed on the long press, so will set the

        // canceled flag for the following up event.

        return true;

    }

    return super.onKeyLongPress(keyCode, event);

}
@Override

public boolean onKeyUp(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_CALL && event.isTracking()

            && !event.isCanceled()) {

        // if the call key is being released, AND we are tracking

        // it from an initial key down, AND it is not canceled,

        // then handle it.

        return true;

    }

    return super.onKeyUp(keyCode, event);

}

 

Lưu ý rằng các mã trên giả định chúng tôi đang thực hiện hành vi khác nhau cho một khóa đó là bình thường xử lý bởi khuôn khổ.Nếu bạn muốn thực hiện ép lâu cho khóa khác, bạn cũng sẽ cần phải ghi đè onKeyDown có khung theo dõi nó:

@Override

public boolean onKeyDown(int keyCode, KeyEvent event)  {

    if (keyCode == KeyEvent.KEYCODE_0) {

        // this tells the framework to start tracking for

        // a long press and eventual key up.  it will only

        // do so if this is the first down (not a repeat).

        event.startTracking();

        return true;

    }

    return super.onKeyDown(keyCode, event);

}

Câu chuyện 3: Làm một mớ hỗn độn với các phím ảo

Bây giờ chúng ta đến với câu chuyện của động cơ ban đầu của chúng tôi cho tất cả những thay đổi này: hỗ trợ cho các phím cứng ảo, như được thấy trên Droid và các thiết bị khác sắp tới. Thay vì nút bấm vật lý, thiết bị này có cảm biến cảm ứng kéo dài bên ngoài của màn hình có thể nhìn thấy, tạo ra một khu vực cho các phím “cứng” để sống như khu vực cảm ứng nhạy cảm. Hệ thống đầu vào thấp cấp tìm kiếm chạm trên màn hình trong lĩnh vực này, và biến chúng thành “ảo” sự kiện quan trọng như cứng thích hợp.

Các ứng dụng này về cơ bản giống như các phím cứng thực tế, mặc dù các sự kiện được tạo ra sẽ có một mới FLAG_VIRTUAL_HARD_KEY chút thiết lập để nhận dạng chúng. Bất kể lá cờ đó, trong hầu hết các trường hợp, một ứng dụng có thể xử lý các sự kiện quan trọng “cứng” trong cùng một cách nó đã luôn luôn làm cho các phím cứng thực.

Tuy nhiên, các phím này giới thiệu một số nếp nhăn trong tương tác người dùng. Quan trọng nhất là các phím tồn tại trên bề mặt giống như phần còn lại của giao diện người dùng, và họ có thể dễ dàng ép với cùng một loại chạm. Điều này có thể trở thành một vấn đề, ví dụ, khi các phím ảo là dọc theo phía dưới của màn hình: một cử chỉ thông thường là hãy kéo mạnh lên màn hình để di chuyển, và nó có thể rất dễ dàng để vô tình chạm vào một phím ảo ở phía dưới khi làm việc.

Các giải pháp cho điều này trong 2.0 là để giới thiệu một khái niệm về một “hủy bỏ” sự kiện quan trọng. Chúng ta đã nhìn thấy điều này trong các câu chuyện trước đây, nơi xử lý một báo dài sẽ hủy bỏ các sự kiện sau đây lên. Theo cách tương tự, di chuyển từ một phím bấm ảo trên vào màn hình sẽ gây ra phím ảo bị hủy bỏ khi nó đi lên.

Trong thực tế mã trước đó đã làm việc này – bằng cách kiểm tra isCanceled () trên phím lên, hủy bỏ phím ảo và máy ép lâu sẽ bị bỏ qua. Ngoài ra còn có lá cờ riêng cho hai trường hợp, nhưng họ hiếm khi được sử dụng bởi các ứng dụng và luôn luôn với sự hiểu biết rằng trong tương lai có thể có nhiều lý do cho một sự kiện quan trọng để được hủy bỏ.

Đối với ứng dụng đã có sẵn và khả năng tương thích BACK phím được bật để thực hiện hành động trên xuống, vẫn còn là vấn đề của vô tình phát hiện một nền báo chí trở lại khi có ý định thực hiện một cú đập. Mặc dù không có giải pháp cho việc này ngoại trừ việc cập nhật một ứng dụng để xác định nó nhắm SDK phiên bản 5 hoặc sau đó, may mắn là quan trọng trở lại thường được đặt trên một xa bên trong những khu vực trọng điểm ảo, vì vậy người sử dụng là rất ít khả năng vô tình đánh nó hơn một số các phím khác.

Viết một ứng dụng hoạt động tốt trên trước 2.0 cũng như 2.0 và phiên bản mới của nền tảng này cũng là khá dễ dàng cho các trường hợp phổ biến nhất. Ví dụ, đây là mã cho phép bạn xử lý các phím trở lại trong một hoạt động một cách chính xác trên tất cả các phiên bản của nền tảng nà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;

}

 

Cho lõi cứng: cử một cách chính xác các sự kiện

Một chủ đề cuối cùng đó là giá trị bao phủ là làm thế nào để xử lý một cách chính xác các sự kiện trong các chức năng văn liệu như onDispatchEvent () hoặc onPreIme () . Những yêu cầu chăm sóc nhiều hơn một chút, vì bạn không thể dựa vào một số sự giúp đỡ khuôn khổ cung cấp khi nó gọi các chức năng cao cấp như onKeyDown () . Mã dưới đây cho thấy làm thế nào bạn có thể đánh chặn các phái của LẠI trọng như vậy mà bạn một cách chính xác thực hiện hành động của bạn khi nó được phát hành.

@Override

public boolean dispatchKeyEvent(KeyEvent event) {

    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {

        if (event.getAction() == KeyEvent.ACTION_DOWN

                && event.getRepeatCount() == 0) {

            getKeyDispatcherState().startTracking(event, this);

            return true;

        } else if (event.getAction() == KeyEvent.ACTION_UP) {

            getKeyDispatcherState().handleUpEvent(event);

            if (event.isTracking() && !event.isCanceled()) {
                // DO BACK ACTION HERE
                return true;
            }

        }

        return super.dispatchKeyEvent(event);

    } else {

        return super.dispatchKeyEvent(event);

    }

}

Các cuộc gọi đến getKeyDispatcherState () trả về một đối tượng được sử dụng để theo dõi trạng thái khóa hiện tại trong cửa sổ của bạn. Nó thường có sẵn trên lớp View, và một hoạt động có thể sử dụng bất kỳ quan điểm của mình để lấy đối tượng nếu cần thiết.

Trung tâm dao tao hoc lap trinh di dong tai da nang hi vọng  với bài đăng đơn giản này có thể giúp ích phần nào đến các bạn. Chúc các bạn có trải nghiệm vui vẽ.

Đăng bình luận

Thành viên bình luận

  • 1166 View