Hangi görüşün odaklandığını nasıl öğrenebilirim?


89

Herhangi bir görünümün bir Aktivite içinde odaklanıp odaklanmadığını ve hangi görünüm olduğunu öğrenmem gerekiyor. Bu nasıl yapılır?

Yanıtlar:


117

getCurrentFocus()Aktiviteyi arayın .


Bazı nedenlerden dolayı, tüm alt görünümleri "sonraki" eylemle değiştirdikten sonra boş döndürür.
WindRider

10
BTW, getCurrentFocus () bir görünüm değil etkinlik yöntemidir.
ToolmakerSteve

3
... böylelikle parçalarda getActivity () kullanabiliriz. getCurrentFocus (). clearFocus () örn ..
Martin Pfeffer

Bir Görünümden ve aramadan barındırma Etkinliği almak mümkündür getCurrentFocus(), ancak o kadar güvenilir değildir.
Eido95

kotlin: parça halinde -activity?.currentFocus
Mohammad Reza Khahani

12

Faaliyetin kaynağından:

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

Bunun yerine bunu deneyin, her şeyi a içine koyun threadve id ve sınıf adını canlı olarak yazdırın logcat. Sadece bu kodu yönteminizin içine koyun Activity, onCreateardından logcatşu anda neyin odaklandığını görmek için kendi yönteminize bakın.

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

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

Bu iş parçacığının 100 ms'lik bir döngüde çalıştığının farkında olun, böylece gereksiz çalışmayla CPU'yu aşmaz.


Bu kodu uzatabilir ve hangi öğenin seçildiğini görebilmek için bir vurgu ekleyebilirsiniz. Öğe ekranın içinde olduğu sürece çalışmalıdır. Ancak kullanmak logcatçok daha güvenlidir.
Haroun Hajem

6

bazı nedenlerden dolayı getCurrentFocus () yöntemi artık kullanılamıyor; muhtemelen kullanımdan kaldırılmıştır, işte çalışma alternatifi:

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

1
İki farklı yöntemdir. getCurrentFocus () bir Activity sınıfı yöntemidir ve getFocusedChild () View sınıfına aittir
BoredT

2
@BoredT: getFocusedChild()bir yöntemdir ViewGroup.
gnuf


1

ViewGroup, odaklanmış çocuğu almak için oldukça uygun bir yönteme sahiptir:

ViewGroup.getFocusedChild()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.