Làm thế nào để tìm ra chế độ xem nào là tiêu điểm?


87

Tôi cần tìm hiểu xem có bất kỳ chế độ xem nào được tập trung bên trong Hoạt động hay không và chế độ xem đó là gì. làm như thế nào?

Câu trả lời:


114

Kêu gọi getCurrentFocus()Hoạt động.


Vì một số lý do, nó trả về null sau khi xoay vòng tất cả các lượt xem con với hành động "tiếp theo".
WindRider

10
BTW, getCurrentFocus () là một phương thức hoạt động, không phải xem.
ToolmakerSteve

3
... như vậy trong mảnh chúng ta có thể sử dụng getActivity () getCurrentFocus () clearFocus () ví dụ ....
Martin Pfeffer

Có thể lấy Hoạt động lưu trữ từ Chế độ xem và cuộc gọi getCurrentFocus(), nhưng không đáng tin cậy như vậy.
Eido95 29/12/16

kotlin: trong mảnh vỡ -activity?.currentFocus
Mohammad Reza Khahani

12

Từ nguồn Hoạt động:

   /**
     * Calls {@link android.view.Window#getCurrentFocus} on the
     * Window of this Activity to return the currently focused view.
     * 
     * @return View The current View with focus or null.
     * 
     * @see #getWindow
     * @see android.view.Window#getCurrentFocus
     */
    public View getCurrentFocus() {
        return mWindow != null ? mWindow.getCurrentFocus() : null;
    }

6

vì một số lý do mà phương thức getCurrentFocus () không còn khả dụng nữa; có lẽ nó đã không còn được dùng nữa, đây là giải pháp thay thế hoạt động:

View focusedView = (View) yourParentView.getFocusedChild();

1
Đó là hai phương pháp khác nhau. getCurrentFocus () là một phương pháp lớp Hoạt động và getFocusedChild () thuộc về lớp View
BoredT

2
@BoredT: getFocusedChild()là một phương thức trên ViewGroup.
gnuf

5

Thay vào đó, hãy thử điều này, đặt mọi thứ bên trong a threadvà in trực tiếp idtên lớp vào logcat. Chỉ cần đặt mã này bên trong của bạn Activity, trong onCreatephương thức, sau đó xem xét của bạn logcatđể xem những gì hiện đang được tập trung.

JAVA

  new Thread(() -> {
        int oldId = -1;
        while (true) {
            View newView= this.getCurrentFocus();
            if (newView!= null && newView.getId() != oldId) {
                oldId = view.getId();
                String idName = "";
                try {
                   idName = getResources().getResourceEntryName(newView.getId());
                 } catch (Resources.NotFoundException e) {
                   idName = String.valueOf(newView.getId());
                 }
                Log.i(TAG, "Focused Id: " + idName + " Class: " + newView.getClass());
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();

KOTLIN

      Thread(Runnable {
            var oldId = -1
            while (true) {
                val newView: View? = this.currentFocus
                if (newView != null && newView.id != oldId) {
                    oldId = newView.id
                    var idName: String = try {
                        resources.getResourceEntryName(newView.id)
                    } catch (e: Resources.NotFoundException) {
                        newView.id.toString()
                    }
                    Log.i(TAG, "Focused Id: " + idName + " Class: " + newView.javaClass)
                }
                try {
                    Thread.sleep(100)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
        }).start()

Lưu ý rằng luồng này chạy trong chu kỳ 100ms để nó không làm tràn CPU với các công việc không cần thiết.


2

nếu bạn đang ở trong một mảnh, bạn có thể sử dụng

getView().findFocus()

1

ViewGroup có một phương pháp khá thuận tiện để truy xuất con tập trung:

ViewGroup.getFocusedChild()
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.