How to find out which view is focused?

前端 未结 6 519
后悔当初
后悔当初 2020-12-01 17:32

I need to find out if any view is focused inside an Activity and what view it is. How to do this?

相关标签:
6条回答
  • 2020-12-01 18:06

    Try this instead, put everything inside a thread and print the id and classname live to logcat. Just put this code inside your Activity, in the onCreate method then look into your logcat to see what is currently focused.

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

    Be aware this thread runs in a 100ms cycle so it doesn't overflow the CPU with unnecessary work.

    0 讨论(0)
  • 2020-12-01 18:11

    From the source of Activity:

       /**
         * 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;
        }
    
    0 讨论(0)
  • 2020-12-01 18:19

    ViewGroup has quite convenient method for retrieving focused child:

    ViewGroup.getFocusedChild()
    
    0 讨论(0)
  • 2020-12-01 18:25

    if you are in a fragment you can use

    getView().findFocus()
    
    0 讨论(0)
  • 2020-12-01 18:30

    for some reason getCurrentFocus() method isn't available anymore; probably it's deprecated already, here the working alternative:

    View focusedView = (View) yourParentView.getFocusedChild();
    
    0 讨论(0)
  • 2020-12-01 18:31

    Call getCurrentFocus() on the Activity.

    0 讨论(0)
提交回复
热议问题