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?

Fixpoint
sumber

Jawaban:

117

Panggil getCurrentFocus()Aktivitas.

Karan
sumber
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;
    }
Tobrun
sumber
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.

Haroun Hajem
sumber
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();
John F.
sumber
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()
Pablo Johnson
sumber
1

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

ViewGroup.getFocusedChild()
Landai
sumber