如何在不将焦点设置到其他控件的情况下移除焦点

Int*_*eXX 88 android android-layout

我喜欢我的UI直观; 每个屏幕应该自然而不引人注目地引导用户进入应用程序的下一步.除此之外,我努力使事情变得混乱和混乱.

开玩笑 :-)

我有三个TableRows,每个包含一个只读和不可聚焦的EditText控件,然后是一个右边的按钮.每个按钮启动相同的活动但具有不同的参数.用户在那里进行选择,子活动结束,EditText用用户的选择填充适当的.

这是经典的级联值机制; 每个选择都会缩小下一个选择的可用选项等.因此,我将禁用每个下一行的两个控件,直到当前行上的EditText包含值.

我需要按照优先顺序做两件事之一:

  1. 单击按钮时,立即移除焦点而不将焦点设置为其他按钮
  2. 活动开始时将焦点设置为第一个按钮

子活动返回后,问题就出现了; 单击的按钮保持焦点.

回复:上面的#1 - 似乎没有removeFocus()方法或类似的东西

回复:上面的#2 - 我可以requestFocus()用来将焦点设置到下一行的按钮,并且在子活动返回后工作,但由于某种原因,它在父活动中不起作用onCreate().

我需要在任一方向上保持UI一致性 - 子活动完成后没有按钮具有焦点,或者每个按钮根据其在逻辑流程中的位置获得焦点,包括在任何选择之前的第一个(也是唯一的)活动按钮.

act*_*imp 169

正如你所发现的那样使用clearFocus()似乎对我不起作用(在另一个答案的评论中看到),但最终对我有用的是添加:

<LinearLayout 
    android:id="@+id/my_layout" 
    android:focusable="true" 
    android:focusableInTouchMode="true" ...>
Run Code Online (Sandbox Code Playgroud)

到我的顶级布局视图(线性布局).要从所有Buttons/EditTexts等中删除焦点,您可以这样做

LinearLayout myLayout = (LinearLayout) activity.findViewById(R.id.my_layout);
myLayout.requestFocus();
Run Code Online (Sandbox Code Playgroud)

除非我将视图设置为可聚焦,否则请求焦点不会做任何事情.

  • 这不适用于ScrollView.如果您的顶视图是ScrollView,请在其子项上使用此视图. (6认同)

wil*_*lma 78

老问题,但是当我遇到类似的问题时,我遇到了它,并且认为我会分享我最终做的事情.

获得焦点的视图每次都不同,所以我使用了非常通用的:

View current = getCurrentFocus();
if (current != null) current.clearFocus();
Run Code Online (Sandbox Code Playgroud)

  • 这样做的优雅方式.有人可能想在调用clearFocus()之前从getCurrentFocus()检查null值 (12认同)
  • @Levit非常迅捷.:-)但即使Java确实实现了这样的运营商,它还需要4年时间才能赶上Android. (5认同)
  • +1是的,你必须抛出那个空检查! - 为什么Java不能只实现一个安全遍历运算符?它会像`getCurrentFocus()?.clearFocus();`一样简单,非常优雅: - / (4认同)
  • @Levit,你现在可能已经找到了它,但是Kotlin. (2认同)

sil*_*gle 9

  1. 你可以用View.clearFocus().

  2. 使用View.requestFocus()来自onResume().


Cra*_*lWS 6

android:descendantFocusability="beforeDescendants"

在活动中使用以下内容以及下面的一些布局选项似乎可以正常工作。

 getWindow().getDecorView().findViewById(android.R.id.content).clearFocus();
Run Code Online (Sandbox Code Playgroud)

在根视图上结合以下参数。

<?xml
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:descendantFocusability="beforeDescendants" />
Run Code Online (Sandbox Code Playgroud)

https://developer.android.com/reference/android/view/ViewGroup#attr_android:descendantFocusability

回答感谢:https : //forums.xamarin.com/discussion/1856/how-to-disable-auto-focus-on-edit-text

关于windowSoftInputMode

还有另一点需要注意。默认情况下,Android会自动将初始焦点分配给Activity中的第一个EditText或可焦点控件。当然,InputMethod(通常是软键盘)将通过显示自身来响应焦点事件。当设置为stateAlwaysHidden时,AndroidManifest.xml中的windowSoftInputMode属性指示键盘忽略此自动分配的初始焦点。

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>
Run Code Online (Sandbox Code Playgroud)

很好的参考


Ho *_*ong 5

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:id="@+id/ll_root_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

LinearLayout llRootView = findViewBindId(R.id.ll_root_view);
llRootView.clearFocus();
Run Code Online (Sandbox Code Playgroud)

我已经完成更新配置文件信息时使用它,并从我的布局中删除EditText中的所有焦点

====>更新:在父布局内​​容中,我的EditText添加行:

android:focusableInTouchMode="true"
Run Code Online (Sandbox Code Playgroud)