首页 > 解决方案 > android中的TextInputEditText没有获得焦点

问题描述

我在线性布局中有一个微调器和 2 个 TextInputEditText。

在一个片段中,我将此布局添加到弹出窗口中。对于微调器,我添加了一个带有图像和文本的自定义适配器。TextInputEditText 没有获得焦点,我尝试了所有可能的方法。

尝试了以下可能的条件

m_PopupWindow.Focusable = true;
 m_PopupWindow.SoftInputMode = SoftInput.StateVisible;
 m_PopupWindow.OutsideTouchable=(true);
 m_PopupWindow.Touchable=(true);
 m_PopupWindow.Update();

并且还尝试使用 TextInputEditText 单击事件使键盘聚焦,这能够打开键盘但 TextInputEditText 没有获得焦点。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants"
    android:background="@drawable/popupBorder"
    android:focusableInTouchMode="true"
    xmlns:app="http://schemas.android.com/apk/res-auto">
         <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:layout_marginLeft="50dp"
        android:layout_marginRight="50dp"
        android:orientation="vertical"
        android:gravity="center_horizontal">

         <Spinner
          android:id="@+id/spinner"
          android:gravity="center_horizontal"
          android:layout_width="328dp"
          android:minWidth="15dp"
          android:layout_height="wrap_content"
            style="@style/mySpinnerItemStyle"
          android:background="@drawable/bg_spinner"
          android:layout_marginTop="40dp"/>

      <android.support.design.widget.TextInputLayout
      android:id="@+id/txtUserName"
        android:layout_width="328dp"
        android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
            >

        <android.support.design.widget.TextInputEditText
            android:id="@+id/userNameEditText"
            android:layout_width="328dp"
            android:layout_height="wrap_content"
                android:textIsSelectable ="true"
                android:focusable="true"
            android:imeActionLabel="Done"
            android:singleLine="true"/>

    </android.support.design.widget.TextInputLayout>

      <android.support.design.widget.TextInputLayout
      android:id="@+id/txtPassword"
        android:layout_width="328dp"
        android:layout_height="wrap_content"
                app:passwordToggleEnabled="true"
                app:passwordToggleTintMode="src_atop"
                app:passwordToggleTint="@drawable/selector_password_visibility_toggle"
                app:passwordToggleDrawable="@drawable/ibk_visible"
            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
            android:layout_marginTop="16dp"
                android:layout_marginBottom="20dp">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/PasswordEditText"
            android:layout_width="328dp"
            android:layout_height="wrap_content"
            android:imeActionLabel="Done"
            android:singleLine="true"
                android:inputType="textPassword"/>

    </android.support.design.widget.TextInputLayout>

            </LinearLayout>




View objPopupview = LayoutInflater.From(ViewGroup.Context).Inflate(Resource.Layout.AddAccountTabPage, null);
            m_PopupWindow = new PopupWindow(objPopupview, LayoutParams.WrapContent, LayoutParams.WrapContent, true);
            m_PopupWindow.Focusable = true;
             m_PopupWindow.SoftInputMode = SoftInput.StateVisible;
            m_PopupWindow.OutsideTouchable=(true);
            m_PopupWindow.Touchable=(true);
            m_PopupWindow.Update();

 txtUserNameEditBox.Click += delegate
                {
                    txtUserNameEditBox.RequestFocus();
                    txtUserName.RequestFocus();
                    txtUserName.FocusableInTouchMode = true;
                    InputMethodManager imm = (InputMethodManager)ViewGroup.Context.GetSystemService(Context.InputMethodService);
                    imm.ShowSoftInput(txtUserName, ShowFlags.Forced);
                    imm.ToggleSoftInput(ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);
                };

标签: c#androidxamarin.androidandroid-edittextandroid-textinputedittext

解决方案


你做错了几件事。

删除以下属性parent LinearLayout

// remove this from parent layouts
android:focusableInTouchMode="true" 

您只能android:focusableInTouchMode="true"在父 ViewGroup 上使用,以便屏幕阅读器用户使用时一次性读取其内容keyboard navigationremote control或者trackball需要先选择视图,然后执行其他操作,例如单击 OK 以触发操作/焦点事件。

...

在触摸模式下可聚焦是一个应该谨慎使用的属性,并且只能在非常特定的情况下使用,因为它破坏了与正常 Android 行为的一致性。

除非您期望上述行为,否则该行是不必要的。

其次,从parent LinearLayout. 我想这可能是您面临重大挑战的罪魁祸首:

// remove this from parent layouts
android:clickable="true"  

当视图父级是clickable *OR* (focusable *AND* focusableInTouchMode)它的 onTouch 事件时,它会拦截其子级的事件,这可能会导致意外行为阻止子级可点击。

还要注释掉以下行:

// comment this out
m_PopupWindow.Touchable=(true);
m_PopupWindow.Focusable = true;

此外,您可以通过在 xml 中添加标签来立即调用request focusEditText<requestFocus />

<EditText...>
    <requestFocus />
</EditText>

推荐阅读