Bagaimana cara mengetahui tampilan mana yang difokuskan?


89

Saya perlu mencari tahu apakah ada tampilan yang difokuskan di dalam Aktivitas dan tampilan apa itu. Bagaimana cara melakukannya?

Jawaban:


117

Panggil getCurrentFocus()Aktivitas.


Untuk beberapa alasan, ini mengembalikan null setelah bersepeda semua tampilan anak dengan tindakan "selanjutnya".
WindRider

10
BTW, getCurrentFocus () adalah metode aktivitas, bukan tampilan.
ToolmakerSteve

3
... jadi dalam fragmen kita bisa menggunakan getActivity (). getCurrentFocus (). clearFocus () misalnya ..
Martin Pfeffer

Dimungkinkan untuk mendapatkan Aktivitas hosting dari View dan panggilan getCurrentFocus(), tetapi tidak dapat diandalkan.
Eido95

kotlin: dalam fragmen -activity?.currentFocus
Mohammad Reza Khahani

12

Dari sumber Kegiatan:

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

Coba ini sebagai gantinya, meletakkan segala sesuatu di dalam threaddan mencetak id dan classname hidup untuk logcat. Letakkan saja kode ini di dalam Anda Activity, dalam onCreatemetode, lalu lihat Anda logcatuntuk melihat apa yang saat ini difokuskan.

JAWA

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

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

Ketahuilah bahwa utas ini berjalan dalam siklus 100 md sehingga tidak membanjiri CPU dengan pekerjaan yang tidak perlu.


Anda dapat memperpanjang kode ini dan menambahkan sorotan sehingga Anda dapat melihat item mana yang dipilih. Ini harus berfungsi selama item ada di dalam layar. Tetapi menggunakan logcatjauh lebih aman.
Haroun Hajem

6

untuk beberapa alasan metode getCurrentFocus () tidak tersedia lagi; mungkin sudah usang, berikut cara kerjanya:

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

1
Ini adalah dua metode berbeda. getCurrentFocus () adalah metode kelas Aktivitas dan getFocusedChild () milik kelas View
BoredT

2
@BoredT: getFocusedChild()adalah metode aktif ViewGroup.
gnuf

2

jika Anda berada dalam sebuah fragmen, Anda dapat menggunakan

getView().findFocus()

1

ViewGroup memiliki metode yang cukup nyaman untuk mengambil anak yang difokuskan:

ViewGroup.getFocusedChild()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.