首页 > 解决方案 > 当键盘出现时,带有editText的PopupWindow showAtLocation不会保持她的位置

问题描述

我对 showAtLocation 方法显示的弹出窗口有一点问题。这是我的布局:

    <?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="2dp"
    card_view:cardCornerRadius="2dp"
    card_view:cardElevation="10dp"
    card_view:cardUseCompatPadding="true">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/menuContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white"
        android:fitsSystemWindows="false">

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="@dimen/itemSearchMargin"
            android:text="@string/itemSearchPopup"
            android:textColor="@android:color/black"
            android:textSize="@dimen/titleitemSearchTextSize"
            android:textStyle="bold"
            card_view:layout_constraintStart_toStartOf="parent"
            card_view:layout_constraintTop_toTopOf="parent" />

        <androidx.cardview.widget.CardView
            android:id="@+id/cardviewSearch"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="14dp"
            android:layout_marginEnd="14dp"
            card_view:cardCornerRadius="2dp"
            card_view:cardUseCompatPadding="true"
            card_view:layout_constraintEnd_toEndOf="parent"
            card_view:layout_constraintStart_toStartOf="parent"
            card_view:layout_constraintTop_toBottomOf="@+id/popupSearchSubtitle">

            <RelativeLayout
                android:id="@+id/relativeLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="0dp"
                android:gravity="center_vertical">

                <EditText
                    android:id="@+id/hub3_search_edit"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/itemSearchEditTextHeight"
                    android:background="@android:color/transparent"
                    android:gravity="center_vertical"
                    android:hint="@string/Search"
                    android:imeOptions="actionSearch"
                    android:inputType="text"
                    android:lines="1"
                    android:paddingStart="5dp"
                    android:paddingEnd="@dimen/itemSearchEditTextPaddingEnd"
                    android:paddingBottom="5dp"
                    android:paddingTop="5dp"
                    android:textColor="#FF000000"
                    android:textSize="16sp" />

                <ImageButton
                    android:id="@+id/hub3_search_button"
                    android:layout_width="@dimen/itemSearchEditTextHeight"
                    android:layout_height="@dimen/itemSearchEditTextHeight"
                    android:layout_alignParentEnd="true"
                    android:layout_centerVertical="true"
                    android:src="@drawable/magnify" />

                <ImageView
                    android:id="@+id/hub3_cancel_button"
                    android:layout_width="@dimen/itemSearchXSize"
                    android:layout_height="@dimen/itemSearchXSize"
                    android:layout_centerVertical="true"
                    android:layout_toStartOf="@id/hub3_search_button"
                    android:src="@drawable/close"
                    android:layout_marginEnd="5dp"
                    android:visibility="gone" />
            </RelativeLayout>
        </androidx.cardview.widget.CardView>

        <TextView
            android:id="@+id/popupSearchSubtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="@dimen/itemSearchMargin"
            android:text="@string/popupSearchSubtitle"
            android:textColor="@android:color/black"
            android:textSize="@dimen/itemSearchSubtitle"
            card_view:layout_constraintStart_toStartOf="parent"
            card_view:layout_constraintTop_toBottomOf="@+id/title" />

        <TextView
            android:id="@+id/bodyItemSearch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="24dp"
            android:layout_marginEnd="24dp"
            android:layout_marginBottom="8dp"
            android:gravity="center"
            android:text="@string/bodyItemSearch"
            android:textColor="@android:color/black"
            android:textSize="14sp"
            card_view:layout_constraintBottom_toTopOf="@+id/imageBodyItemSearch"
            card_view:layout_constraintEnd_toEndOf="parent"
            card_view:layout_constraintHorizontal_bias="0.5"
            card_view:layout_constraintStart_toStartOf="parent"
            card_view:layout_constraintTop_toBottomOf="@+id/cardviewSearch"
            card_view:layout_constraintVertical_bias="0.3"
            card_view:layout_constraintVertical_chainStyle="packed" />

        <ImageView
            android:id="@+id/imageBodyItemSearch"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginTop="8dp"
            card_view:layout_constraintBottom_toBottomOf="parent"
            card_view:layout_constraintEnd_toEndOf="parent"
            card_view:layout_constraintHorizontal_bias="0.5"
            card_view:layout_constraintStart_toStartOf="parent"
            card_view:layout_constraintTop_toBottomOf="@+id/bodyItemSearch"
            card_view:layout_constraintVertical_chainStyle="packed"
            card_view:srcCompat="@drawable/icon_search_item" />

        <androidx.constraintlayout.widget.Group
            android:id="@+id/groupbodyItemSearch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="visible"
            card_view:constraint_referenced_ids="bodyItemSearch,imageBodyItemSearch" />

        <ProgressBar
            android:id="@+id/progressBarItemSearch"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            card_view:layout_constraintBottom_toBottomOf="parent"
            card_view:layout_constraintEnd_toEndOf="parent"
            card_view:layout_constraintHorizontal_bias="0.5"
            card_view:layout_constraintStart_toStartOf="parent"
            card_view:layout_constraintTop_toBottomOf="@+id/cardviewSearch"
            card_view:layout_constraintVertical_chainStyle="packed" />

        <androidx.constraintlayout.widget.Group
            android:id="@+id/groupLoadingItemSearch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            card_view:constraint_referenced_ids="progressBarItemSearch" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/itemSearchList"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:background="@color/grayF4"
            card_view:layout_constraintBottom_toBottomOf="parent"
            card_view:layout_constraintEnd_toEndOf="parent"
            card_view:layout_constraintStart_toStartOf="parent"
            card_view:layout_constraintTop_toBottomOf="@+id/searchFoundItemSearch"/>

        <TextView
            android:id="@+id/searchFoundItemSearch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:text=""
            android:textStyle="italic"
            android:textColor="@android:color/black"
            android:textSize="@dimen/itemSearchSubtitle"
            card_view:layout_constraintStart_toStartOf="parent"
            card_view:layout_constraintTop_toBottomOf="@+id/cardviewSearch" />

        <androidx.constraintlayout.widget.Group
            android:id="@+id/searchListGroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            card_view:constraint_referenced_ids="itemSearchList,searchFoundItemSearch" />


    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>

我必须在某个坐标 x,y 处修复弹出窗口,为此我使用了以下方法:

popupWindow.showAtLocation(锚,Gravity.NO_GRAVITY,位置[0],位置[1])

当回收器视图为空并且显示键盘时,弹出窗口显示在正确的位置,但遗憾的是,当回收器视图不为空并且显示键盘时,弹出窗口不会保持她的位置并且它向上移动

编辑:我使用了 showAtLocation,因为使用 showAsDropDown,popupView 在 ui 刷新期间也会跟随锚视图,这会导致从随机位置快速移动到正确位置。我已经尝试使用 showAtLocation 来解决 ax,y 坐标.. 你的解决方案我想我会遇到与 showAsDropDown 相同的问题

标签: androidandroid-layoutandroid-constraintlayout

解决方案


您可以使用以下代码打开弹出窗口并设置锚视图以调整位置

private void openTeacherList() {
    ArrayAdapter specializationAdapter = new ArrayAdapter(this, 
    android.R.layout.simple_spinner_dropdown_item, teacherNameList);
    final ListPopupWindow popupWindow = new ListPopupWindow(this);
    popupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView parent, View view, int position, long id) 
 {
            binding.txtTeacher.setText(teacherNameList.get(position));
            teacherId = teacherList.get(position).getId() + "";
            popupWindow.dismiss();
        }
    });



 popupWindow.setContentWidth(androidx.appcompat.widget.ListPopupWindow.WRAP_CONTENT);
    popupWindow.setHeight(androidx.appcompat.widget.ListPopupWindow.WRAP_CONTENT);
    popupWindow.setAnchorView(binding.txtTeacher);
    popupWindow.setAdapter(specializationAdapter);
    popupWindow.show();
 }

推荐阅读