จะรู้ได้อย่างไรว่ามุมมองใดที่เน้น?


89

ฉันต้องการทราบว่ามุมมองใดที่มุ่งเน้นในกิจกรรมและมุมมองนั้นเป็นอย่างไร ต้องทำอย่างไร?

คำตอบ:


117

โทรหาgetCurrentFocus()กิจกรรม


ด้วยเหตุผลบางประการระบบจะส่งคืนค่าว่างหลังจากหมุนเวียนมุมมองย่อยทั้งหมดด้วยการดำเนินการ "ถัดไป"
WindRider

10
BTW, getCurrentFocus () เป็นวิธีการของกิจกรรมไม่ใช่มุมมอง
ToolmakerSteve

3
... ดังนั้นในส่วนย่อยเราสามารถใช้ getActivity (). getCurrentFocus (). clearFocus () เช่น ..
Martin Pfeffer

เป็นไปได้ที่จะรับการโฮสต์กิจกรรมจากการดูและโทรgetCurrentFocus()แต่ไม่น่าเชื่อถือขนาดนั้น
Eido95

kotlin: in fragment -activity?.currentFocus
Mohammad Reza Khahani

12

จากแหล่งที่มาของกิจกรรม:

   /**
     * 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;
    }

7

ลองนี้แทนใส่ทุกอย่างภายในthreadและพิมพ์รหัสและClassNamelogcatมีชีวิตอยู่เพื่อ เพียงใส่รหัสนี้ActivityในonCreateวิธีการของคุณจากนั้นตรวจสอบของคุณlogcatเพื่อดูสิ่งที่กำลังมุ่งเน้น

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: \t" + idName + "\tClass: \t" + newView.getClass());
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();

คอตลิน

      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: \t" + idName + "\tClass: \t" + newView.javaClass)
                }
                try {
                    Thread.sleep(100)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
        }).start()

โปรดทราบว่าเธรดนี้ทำงานในรอบ 100ms ดังนั้นจึงไม่ทำให้ CPU ล้นไปด้วยการทำงานที่ไม่จำเป็น


คุณสามารถขยายรหัสนี้และเพิ่มไฮไลต์เพื่อดูว่ารายการใดถูกเลือก ควรใช้งานได้ตราบเท่าที่รายการอยู่ในหน้าจอ แต่การใช้logcatนั้นปลอดภัยกว่ามาก
Haroun Hajem

6

ด้วยเหตุผลบางประการเมธอด getCurrentFocus () ไม่สามารถใช้งานได้อีกต่อไป อาจจะเลิกใช้แล้วทางเลือกที่ใช้งานได้ที่นี่:

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

1
เป็นสองวิธีที่แตกต่างกัน getCurrentFocus () เป็นเมธอดคลาสกิจกรรมและ getFocusedChild () เป็นของคลาส View
BoredT

2
@BoredT: getFocusedChild()เป็นวิธีการบนViewGroup.
gnuf


1

ViewGroup มีวิธีที่ค่อนข้างสะดวกในการดึงข้อมูลเด็กที่มุ่งเน้น:

ViewGroup.getFocusedChild()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.