68

我已经阅读了讨论这个问题的其他问题,除了第一个创建的布局之外,所有这些问题都适用于我的布局。

目前,这是我的onCreate方法的顶部:

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

^ 这使得至少键盘不会在启动时弹出,但EditText仍然专注于。

这是XML我的EditText

<EditText
    android:id="@+id/password"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/changePass"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="167dp"
    android:ems="10"
    android:imeOptions="flagNoExtractUi"
    android:inputType="textPassword"
    android:maxLength="30" >
</EditText>

这是我提出活动时的样子:

在此处输入图像描述

问题是,对于某些手机,当一个EditText像这样聚焦时,他们不能在里面写字。我希望它集中。

我所做的工作适用于提出的下一个布局,因为它EditTexts没有专注于并且看起来更像这样:

在此处输入图像描述

请注意,它是相同的布局。这是用户被带回到这个屏幕后的屏幕,这表明没有任何问题,XML因为这是相同的XML,但问题是EditText只有在创建活动时才关注。

我已经完成了研究,所有其他问题都没有帮助我解决这个问题(但是他们确实帮助键盘没有出现,谢天谢地)。我怎样才能使它EditText在启动时看起来像第二个屏幕截图,而不是第一个屏幕截图?

4

13 回答 13

301

您可以设置 Layout 的属性,例如android:descendantFocusability="beforeDescendants"android:focusableInTouchMode="true"

例子:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mainLayout"
  android:descendantFocusability="beforeDescendants"
  android:focusableInTouchMode="true" >

    <EditText
        android:id="@+id/password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/changePass"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="167dp"
        android:ems="10"
        android:imeOptions="flagNoExtractUi"
        android:inputType="textPassword"
        android:maxLength="30" >
    </EditText>

</RelativeLayout>

愿这有帮助;)

于 2013-08-18T05:12:21.193 回答
18

XML 代码:

<EditText
    android:id="@+id/password"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/changePass"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="167dp"
    android:ems="10"
    android:focusable="false"
    android:imeOptions="flagNoExtractUi"
    android:inputType="textPassword"
    android:maxLength="30" >
</EditText>

Java代码:

EditText edPwd = (EditText)findViewById(R.id.password);
edtPwd.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            v.setFocusable(true);
            v.setFocusableInTouchMode(true);
            return false;
        }
    });

在 xml 中设置可聚焦的 false 并通过代码将其设置为 true

于 2013-08-18T05:14:05.853 回答
12

在你的 main_layout 添加这 2 行:

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

例子:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"> *YOUR LAYOUT CODE* </RelativeLayout>
于 2016-02-08T09:21:49.533 回答
2

在 onCreate() 中添加这个

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

或在 onCreateView()

 getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
于 2017-03-16T05:41:14.463 回答
2

最好的解决方案在这里: https ://stackoverflow.com/a/45139132/3172843

正确而简单的解决方案是 setFocusable false 和setFocusableInTouchMode true。所以只有当用户触摸 EditText 时 EditText 才会获得焦点

android:focusable="false"
android:focusableInTouchMode="true"
于 2017-07-17T08:18:52.217 回答
1

XML 代码

<EditText 
    android:imeOptions="flagNoExtractUi"
    android:focusable="false"
    />

onClickListerner 中的 Java 代码

 mEdtEnterPhoneNumber.setFocusable(true);
    mEdtEnterPhoneNumber.setFocusableInTouchMode(true);
于 2016-06-16T03:24:01.900 回答
0

可以使用android:focusable="false"它来禁用它,但如果由于某种原因这不起作用,那么您可以简单地放置 a LinearLayout,它会在不破坏您的布局的情况下获得焦点。

注意:Eclipse 会给你一个错误,说你LinearLayout是无用的,因为它没有内容。您应该可以毫无问题地忽略它。

例如:

<LinearLayout
    android:focusable="true"
    android:focusableInTouchMode="false"
    android:layout_width="0dp"
    android:layout_height="0dp"
    />
<EditText
    android:id="@+id/password"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/changePass"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="167dp"
    android:ems="10"
    android:imeOptions="flagNoExtractUi"
    android:inputType="textPassword"
    android:maxLength="30" >
</EditText>
</LinearLayout>
于 2013-08-18T05:16:03.603 回答
0

您可以以编程方式执行此操作。editText.setEnabled(false)在您的活动方法中使用onStart()(而不是在 onCreate() - 因为这是初始化 GUI 组件的一些方法)

于 2016-01-06T09:40:02.210 回答
0
<activity
            android:name=".MainActivity"
            android:windowSoftInputMode="stateAlwaysHidden" />

android:windowSoftInputMode="stateAlwaysHidden"

将此行添加到 Manifest.xml 文件的活动标记中。当您单击 EditText 时,键盘将成为焦点。

于 2017-10-05T07:26:04.860 回答
0

最简单的方法是添加

android:windowSoftInputMode="stateAlwaysHidden|adjustPan" 

在 Manifest.xml 文件的活动标记中

于 2018-02-26T09:44:38.220 回答
0

1)它最简单,打开清单并将以下代码放在活动标签之间:

android:windowSoftInputMode="stateHidden"

2)将此属性放在父布局中

android:focusable="true" 
android:focusableInTouchMode="true"
于 2018-09-18T08:23:53.967 回答
0

在 Manifest 中,复制并粘贴下面的代码。

 <activity
   android:name=".LoginActivity"
   android:windowSoftInputMode="stateAlwaysHidden"/>
于 2018-11-09T07:57:00.800 回答
-7

用于 android:focusable="false" 禁用对焦

<EditText
    android:id="@+id/password"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/changePass"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="167dp"
    android:ems="10"
    android:imeOptions="flagNoExtractUi"
    android:inputType="textPassword"
    android:maxLength="30"
 android:focusable="false" >

</EditText>
于 2013-08-18T05:07:31.173 回答