如何消除焦点而不把焦点放在另一个控制上?

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

开玩笑 :-)

我有三个TableRows,每个包含一个只读和不可调焦的EditText控件,然后在其右侧有一个button。 每个button启动相同的活动,但具有不同的参数。 用户在那里做出select,子活动结束,用用户的select填充适当的EditText。

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

我需要按照以下顺序执行以下两项操作之一:

  1. 点击一个button时,请立即移除焦点,而不要将焦点设置为不同的button
  2. 活动开始时,将焦点设置到第一个button

问题在子活动返回后出现; 被点击的button保持焦点。

回复:#1以上 – 似乎没有一个removeFocus()方法,或类似的东西

Re:上面的#2 – 我可以使用requestFocus()将焦点设置到下一行的button,并且在子活动返回之后工作,但由于某种原因,它在父活动的onCreate()中不起作用。

我需要在任何一个方向的UI一致性 – 在子活动完成后,或者每个button都获得焦点(取决于其在逻辑stream程中的位置,包括在任何select之前的第一个(且唯一的)活动button),则没有button具有焦点。

使用clearFocus()似乎没有为我工作,或者你发现(看到在另一个答案的意见),但最终对我的工作是增加:

<LinearLayout android:id="@+id/my_layout" android:focusable="true" android:focusableInTouchMode="true" ...> 

到我的顶级布局视图(线性布局)。 要从所有button/ EditTexts等删除焦点,然后就可以了

 LinearLayout myLayout = (LinearLayout) activity.findViewById(R.id.my_layout); myLayout.requestFocus(); 

除非我将观点设定为可调整的,否则请求焦点不会做任何事情。

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

获得重点的观点每次都不一样,所以我用了非常通用的观点:

 View current = getCurrentFocus(); if (current != null) current.clearFocus(); 
  1. 你可以使用View.clearFocus()

  2. 使用从onResume()调用的View.requestFocus() onResume()

那么只需在清单中的活动中添加android:windowSoftInputMode="stateHidden"

采取从一个聪明的人评论这个: https : //stackoverflow.com/a/2059394/956975

首先,它会100%的工作……..

  1. 创buildonResume()方法。
  2. 在这个onResume()里面, findViewById()find一次又一次聚焦的视图。
  3. 在这个onResume()里面设置requestFocus()到这个视图。
  4. 在这个onResume()里面设置clearFocus为这个视图。
  5. 进入相同的布局的XML,find你想要聚焦的顶视图,并设置focusable真实和focusableInTuch真实。
  6. 在这个onResume()里面,通过findViewByIdfind上面的顶视图
  7. 在这个onResume()设置requestFocus()到这个视图。
  8. 现在享受……
 <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(); 

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

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

 android:focusableInTouchMode="true" 

您可以尝试closures主Activity的保存状态(从而使其忘记了文本以及焦点所在)。 你需要有一些其他方法来记住你的EditText有什么,并重新填充onResume()。 使用startActivityForResult()启动子活动,并在主Activity中创build一个onActivityResult()处理程序,以正确更新EditText。 这样,您可以在使用myButton.post(new Runnable(){run(){myButton.requestFocus();}})重新设置EditText的同时,设置合适的onResume()button。

View.post()方法最初设置焦点很有用,因为这个runnable会在窗口创build完成之后执行,让事情稳定下来,从而使焦点机制在那个时候正常工作。 尝试在onCreate / Start / Resume()期间设置焦点通常有问题,我发现。

请注意,这是伪代码,未经testing,但这是一个可能的尝试方向。

我试图禁用和启用可视性的焦点,它为我工作(焦点被重置):

 focusedView.setFocusable(false); focusedView.setFocusableInTouchMode(false); focusedView.setFocusable(true); focusedView.setFocusableInTouchMode(true);