如何消除焦点而不把焦点放在另一个控制上?
我喜欢我的UI是直观的; 每个屏幕都应该自然而不引人注目地引导用户进入应用的下一步。 除此之外,我努力使事情变得混乱和混乱。
开玩笑 :-)
我有三个TableRows,每个包含一个只读和不可调焦的EditText控件,然后在其右侧有一个button。 每个button启动相同的活动,但具有不同的参数。 用户在那里做出select,子活动结束,用用户的select填充适当的EditText。
这是经典的级联价值机制; 每个select都会缩小下一个select的可用选项等。因此,我将禁用每个下一行的两个控件,直到当前行上的EditText包含一个值。
我需要按照以下顺序执行以下两项操作之一:
- 点击一个button时,请立即移除焦点,而不要将焦点设置为不同的button
- 活动开始时,将焦点设置到第一个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();
-
你可以使用
View.clearFocus()
。 -
使用从
onResume()
调用的View.requestFocus()
onResume()
。
那么只需在清单中的活动中添加android:windowSoftInputMode="stateHidden"
。
采取从一个聪明的人评论这个: https : //stackoverflow.com/a/2059394/956975
首先,它会100%的工作……..
- 创build
onResume()
方法。 - 在这个
onResume()
里面,findViewById()
find一次又一次聚焦的视图。 - 在这个
onResume()
里面设置requestFocus()
到这个视图。 - 在这个
onResume()
里面设置clearFocus
为这个视图。 - 进入相同的布局的XML,find你想要聚焦的顶视图,并设置
focusable
真实和focusableInTuch
真实。 - 在这个
onResume()
里面,通过findViewById
find上面的顶视图 - 在这个
onResume()
设置requestFocus()
到这个视图。 - 现在享受……
<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);