我有一个微调器和线性布局内的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);
                };

最佳答案

您做错了几件事。

parent LinearLayout删除以下属性

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



  您只能在父级ViewGroup上使用android:focusableInTouchMode="true"
  对于使用keyboard navigationremote controltrackball的屏幕阅读器用户,所有内容将一次全部读取,这需要先选择视图,然后再执行其他操作,例如单击“确定”以触发操作/焦点事件。


...


  在触摸模式下可聚焦的属性应谨慎使用,并且仅在
  非常特殊的情况,因为它破坏了与常规Android的一致性
  行为。


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

其次,从parent LinearLayout中删除​​以下属性。我想这可能是您面临的主要挑战的元凶:

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


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

还注释掉以下行:

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


此外,您可以通过在xml中添加request focus标记在EditText上立即调用<requestFocus />

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

07-24 09:37