在Android应用程序中设置初始焦点

89
在我的Android应用程序中,它会自动将焦点定位在我布局中的第一个Button上,并给它一个橙色的轮廓。我如何在XML中设置初始焦点,并且可以将其设置为空吗?
8个回答

167

您可以使用requestFocus标签:

<Button ...>
  <requestFocus />
</Button>

我觉得奇怪的是它会自动聚焦到你的其中一个按钮,我在我的任何视图中都没有观察到这种行为。


1
@stealthcopter:你能告诉我你正在使用哪个Android版本吗?我正在使用2.1和2.2,但requestFocus不起作用。 - anticafe
我一直在使用它的所有版本,但是我遇到的问题似乎自己消失了,所以我没有进行过多的调查。 - stealthcopter
19
我尝试过使用XML方法,也尝试过编程方法。但EditText仍然保持焦点,非常烦人! - Someone Somewhere
对于一个EditText,使用编程方法,并确保使用setFocusableInTouchMode(true); - Someone Somewhere
4
<requestFocus /> 在这里:http://developer.android.com/guide/topics/resources/layout-resource.html#requestfocus-element。该标签用于在Android布局中设置默认获取焦点的视图。 - Erik B
显示剩余3条评论

67

@Someone Somewhere,我尝试了以上所有方法都没有成功。我找到的解决方法是从http://www.helloandroid.com/tutorials/remove-autofocus-edittext-android上得到的。基本上,您需要创建一个不可见的布局,放置在有问题的按钮上方:

<LinearLayout android:focusable="true"
              android:focusableInTouchMode="true" 
              android:layout_width="0px"
              android:layout_height="0px" >
    <requestFocus />
</LinearLayout>

我能够将焦点集中在AlertDialog上,并启用FocusableInTouchMode帮助我做到这一点。基本上,操作如下:alert.show(); alert.getButton(AlertDialog.BUTTON_POSITIVE).setFocusableInTouchMode(true);alert.getButton(AlertDialog.BUTTON_NEGATIVE).requestFocus(); - Sagar Hatekar
2
谢谢!这是我情况下唯一有效的解决方案。虽然我使用了略微不同的方法;我将焦点内容放在一个包含EditText的RelativeLayout中。 - kaka
1
随着Android P的到来,平台将会有以下变化: “视图面积为0(宽度或高度之一为0)将不再具有焦点。 此外,在触摸模式下,活动不再隐式分配初始焦点。相反,如果需要,您需要明确请求初始焦点。” - AustrianDude

29

:focusable:focusableInTouchMode都设置为true,并调用requestFocus。这样可以解决问题。


是的,这是真正的解决方案来修复它。谢谢Anders。 - gokhansari

25

我发现这对我来说效果最好。

在AndroidManifest.xml的<activity>元素中添加 android:windowSoftInputMode="stateHidden"

这将始终在进入活动时隐藏键盘。


简单而干净! - SHADOW.NET
太棒了...这非常令人印象深刻! - gumuruh

11

我刚刚在onCreate()中添加了这一行代码:

this.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

问题已解决。


8

请使用以下代码:

TableRow _tableRow =(TableRow)findViewById(R.id.tableRowMainBody);
tableRow.requestFocus();

那应该可以运行。

3

我曾使用以下方法来清除焦点:

editText.clearFocus();

它有助于


1
android:focusedByDefault="true"

2
属性 focusedByDefault 仅在 API 级别 26 及更高版本中使用(当前最低级别为 21)。 - AlexS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接