Android EditText 焦点问题,错误的 EditText

标签 android android-layout

EditText 快把我们逼疯了!真的!

我们的应用程序登录屏幕出现问题。它包含两个 EditText,但只有第一个(用户名)获得焦点,通过 SoftKeyboard 仅在触摸/单击用户名 EditText 时才会显示。 单击用户名 EditText 后,SoftKeyboard 可见,然后触摸/单击密码 EditText 时显示聚焦(光标在密码 EditText 中闪烁),但键盘输入将插入用户名 EditText。

现在是有趣的部分。我们尝试通过屏幕(通过按下电源按钮)将其关闭并再次打开,然后,令人惊讶的是,一切都按预期进行。

我们是否遗漏了什么?

我们什么都试过了:

  • 扁平化 View 层次结构
  • 布局只有一个包含 View 的线性布局
  • 可聚焦,在触摸模式下可聚焦
  • 从父 ScrollView 中移除填充视口(viewport)
  • 将 fragment 转换为 Activity

我们正在使用 Android 设计支持库 v23.1.1 和 AppCompat 库 v23.1.1

Screenshot of the login screen

登录 fragment .java

public class LoginFragment extends Fragment {

private LoginButton fbLoginButton;
private EditText etxUsername;
private EditText etxPassword;
private Button btnLogin;
private Button btnRegister;
private Button btnRequestPassword;
private ImageView backgroundImage;
private View content;

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup   container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_login, container, false);
        fbLoginButton = (LoginButton) root.findViewById(R.id.fb_login);
        fbLoginButton.setFragment(this);
        content = root.findViewById(R.id.content);
        etxUsername = (EditText) root.findViewById(R.id.etx_username);
        etxPassword = (EditText) root.findViewById(R.id.etx_password);
        btnLogin = (Button) root.findViewById(R.id.btn_login);
        btnLogin.setOnClickListener(v -> login());
        btnRegister = (Button) root.findViewById(R.id.btn_register);
        btnRegister.setOnClickListener(v -> showRegister());
        btnRequestPassword = (Button) root.findViewById(R.id.btn_request_password);
        btnRequestPassword.setOnClickListener(v -> requestPassword());
        backgroundImage = (ImageView) root.findViewById(R.id.backgroundImage);
        return root;
    }
}

fragment _登录.xml

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <ImageView
        android:id="@+id/backgroundImage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerVertical="true"
        android:scaleType="centerCrop"/>

    <ScrollView
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        android:layout_centerInParent="true"
        android:background="@color/transparent_black">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="16dp">

            <LinearLayout
                android:id="@+id/login_form"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <ImageView
                    android:layout_width="150dp"
                    android:layout_height="150dp"
                    android:layout_gravity="center"
                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                    android:padding="@dimen/activity_horizontal_margin"
                    android:src="@drawable/login_logo"/>

                <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:minHeight="48dp"
                    android:orientation="horizontal">

                    <ImageView
                        android:layout_width="24dp"
                        android:layout_height="24dp"
                        android:layout_marginRight="32dp"
                        android:src="@drawable/ic_w_user_24"/>

                    <EditText
                        android:id="@+id/etx_username"
                        style="@style/AccountManagerEditText.Light"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:hint="@string/username_or_email"
                        android:focusable="true"
                        android:nextFocusDown="@+id/etx_password"
                        android:inputType="text"/>
                </LinearLayout>

                <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:minHeight="48dp"
                    android:orientation="horizontal">

                    <ImageView
                        android:layout_width="24dp"
                        android:layout_height="24dp"
                        android:layout_marginRight="32dp"
                        android:src="@drawable/ic_w_password_24"/>

                    <EditText
                        android:id="@+id/etx_password"
                        style="@style/AccountManagerEditText.Light"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:focusable="true"
                        android:hint="@string/password"
                        android:inputType="textPassword"/>
                </LinearLayout>
            </LinearLayout>

            <Button
                android:id="@+id/btn_request_password"
                style="@style/VLButtonFlat.Light"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginTop="@dimen/spacing"
                android:text="@string/forgot_password"
                android:textAllCaps="false"
                android:textAppearance="@style/TextAppearance.AppCompat.Caption"
                android:textColor="@color/white"/>

            <Button
                android:id="@+id/btn_login"
                style="@style/VLButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:text="@string/login"/>


            <TextView
                style="@style/TextAppearance.AppCompat.Body1"
                android:layout_width="wrap_content"
                android:layout_height="38dp"
                android:autoLink="all"
                android:clickable="true"
                android:layout_gravity="center"
                android:gravity="center"
                android:text="or"
                android:textColor="@color/white"/>

            <com.facebook.login.widget.LoginButton
                android:id="@+id/fb_login"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginBottom="@dimen/activity_vertical_margin"
                android:layout_marginTop="@dimen/activity_vertical_margin"/>

            <Button
                android:id="@+id/btn_register"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:text="@string/create_new_account"
                android:textAllCaps="false"
                android:textAppearance="@style/TextAppearance.AppCompat.Caption"/>

        </LinearLayout>
    </ScrollView>

</RelativeLayout>

编辑: 添加样式

<resources
xmlns:tools=" http://schemas.android.com/tools"
tools:ignore="MissingPrefix">

<style name="AccountManagerTheme.Dark" parent="Theme.AppCompat">
    <item name="colorPrimary">@color/black</item>
    <item name="colorPrimaryDark">@color/black</item>
    <item name="colorAccent">@color/dirty_white</item>
    <item name="android:textColorPrimary">@color/black</item>
    <item name="android:textColorSecondary">@color/dirty_white</item>
</style>

<style name="AccountManagerEditText.Light" parent="Base.Widget.AppCompat.EditText">
    <item name="android:theme">@style/AccountManagerTheme</item>
    <item name="android:textAppearance">@style/TextAppearance.AppCompat.Body1</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:minHeight">48dp</item>
    <item name="android:textColorHint">@color/dirty_white</item>
</style>

<style name="AccountManagerEditText.Dark" parent="Base.Widget.AppCompat.EditText">
    <item name="android:theme">@style/AccountManagerTheme.Dark</item>
    <item name="android:textAppearance">@style/TextAppearance.AppCompat.Body1</item>
    <item name="android:textColorHint">@color/dirty_white</item>
    <item name="android:minHeight">48dp</item>
</style>

最佳答案

尝试在作为 ScrollView 的子布局的布局中组合这两者: android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true"

关于Android EditText 焦点问题,错误的 EditText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34221642/

相关文章:

android - 只是更新一个小部件 RemoteViews 而不是完全创建一个新的?

android - ImageView 填充 parent 的宽度或高度,但保持纵横比

android - Android中不同屏幕尺寸的布局

java - 为什么java中的静态方法应该只接受其方法内的最终或非最终变量,而不是静态的?

android - Gradle 忽略传递依赖(而且我没有使用仅 Artifact 表示法)

android - 如何获取在Android中添加我的 View 的容器的宽度

android - 在 android studio 中找不到我的自定义 View 的自定义属性

android - API 28(Android Pie) 上支持 Android StrongBox 的 Android 智能手机列表

android - 错误膨胀类 ImageView - android.view.InflateException : Binary XML file line #10: Error inflating class ImageView

android - 设计支持库,工具栏按钮裁剪波纹