【问题标题】:align android popup dialog with the expected area of the screen将android弹出对话框与屏幕的预期区域对齐
【发布时间】:2021-11-23 06:42:11
【问题描述】:

我目前正在修改已由某人完成的 Android 应用程序。我需要修改此应用程序的列表视图中可见的虚线下方的现有居中对齐弹出对话框,如下所示。

我尝试了一些不同的方法来让这个弹出对话框与那些虚线对齐,但都没有奏效。

WindowManager.LayoutParams param = dialog.getWindow().getAttributes();
    param.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
    param.y = y;
    dialog.getWindow().setAttributes(param); // param.x and param.y also not working 

我附上了我的预期和实际结果,以及下面的所有相关代码。

dialog_options_menu.xml

    <?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@color/white"
    app:cardCornerRadius="10dp"
    app:cardUseCompatPadding="false">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/option_download"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:minWidth="200dp"
            android:orientation="horizontal"
            android:paddingHorizontal="16dp"
            android:paddingVertical="18dp">

            <ImageView
                android:id="@+id/ivDownload"
                android:layout_width="24dp"
                android:layout_height="wrap_content"
                app:srcCompat="@drawable/ic_download" />

            <TextView
                android:id="@+id/tvDownload"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginHorizontal="12dp"
                android:text="@string/download_lowercase"
                android:textColor="@color/black"
                android:textSize="16sp" />

        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/light_grey" />

        <LinearLayout
            android:id="@+id/option_like"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:minWidth="200dp"
            android:orientation="horizontal"
            android:paddingHorizontal="16dp"
            android:paddingVertical="18dp">

            <ImageView
                android:id="@+id/ivLike"
                android:layout_width="24dp"
                android:layout_height="wrap_content"
                app:srcCompat="@drawable/ic_like" />

            <TextView
                android:id="@+id/tvLike"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginHorizontal="12dp"
                android:text="@string/add_favorites"
                android:textColor="@color/black"
                android:textSize="16sp" />

        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/light_grey" />

        <LinearLayout
            android:id="@+id/option_share"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:minWidth="200dp"
            android:orientation="horizontal"
            android:paddingHorizontal="16dp"
            android:paddingVertical="18dp">

            <ImageView
                android:id="@+id/ivShare"
                android:layout_width="24dp"
                android:layout_height="wrap_content"
                app:srcCompat="@drawable/ic_share" />

            <TextView
                android:id="@+id/tvShare"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginHorizontal="12dp"
                android:text="@string/share_dialog_text"
                android:textColor="@color/black"
                android:textSize="16sp" />

        </LinearLayout>
    </LinearLayout>

</androidx.cardview.widget.CardView>

DialogHelper.java

 public static void showEpisodeOptionsDialog(Context context, boolean shouldBeDownloaded, boolean isDownloading, boolean isFavorite, int y, OnEpisodeOptionsMenuItemClickListener clickListener){
        final Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCancelable(true);
        dialog.setContentView(R.layout.dialog_options_menu);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

        WindowManager.LayoutParams param = dialog.getWindow().getAttributes();
        param.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
        param.y = y;
        dialog.getWindow().setAttributes(param);

        TextView tvDownload = (TextView) dialog.findViewById(R.id.tvDownload);
        TextView tvLike = (TextView) dialog.findViewById(R.id.tvLike);
        ImageView ivDownload = (ImageView) dialog.findViewById(R.id.ivDownload);
        ImageView ivLike = (ImageView) dialog.findViewById(R.id.ivLike);
        LinearLayout btnDownload = (LinearLayout) dialog.findViewById(R.id.option_download);
        LinearLayout btnLike = (LinearLayout) dialog.findViewById(R.id.option_like);
        LinearLayout btnShare = (LinearLayout) dialog.findViewById(R.id.option_share);

        String downloadText, likeText;
        int selectedColor = ContextCompat.getColor(context, R.color.option_selected_orange);
        int defaultColor = ContextCompat.getColor(context, R.color.black);

        if (shouldBeDownloaded) {
            if (isDownloading) {
                downloadText = context.getString(R.string.downloading_lowercase);
            } else {
                downloadText = context.getString(R.string.remove_download);
            }
            ivDownload.setImageResource(R.drawable.ic_bin);
            tvDownload.setTextColor(selectedColor);
        } else {
            downloadText = context.getString(R.string.download_lowercase);
            ImageViewCompat.setImageTintList(ivDownload, ColorStateList.valueOf(defaultColor));
            tvDownload.setTextColor(defaultColor);
        }

        if (isFavorite) {
            likeText = context.getString(R.string.remove_favorites);
            ImageViewCompat.setImageTintList(ivLike, ColorStateList.valueOf(selectedColor));
            tvLike.setTextColor(selectedColor);
        } else {
            likeText = context.getString(R.string.add_favorites);
            ImageViewCompat.setImageTintList(ivLike, ColorStateList.valueOf(defaultColor));
            tvLike.setTextColor(defaultColor);
        }

        tvDownload.setText(downloadText);
        tvLike.setText(likeText);

        btnDownload.setOnClickListener(v -> {
            dialog.dismiss();
            clickListener.onDownloadClicked();
        });
        btnLike.setOnClickListener(v -> {
            dialog.dismiss();
            clickListener.onLikeClicked();
        });
        btnShare.setOnClickListener(v -> {
            dialog.dismiss();
            clickListener.onShareClicked();
        });

        dialog.show();
    }

请告诉我这个弹出对话框如何与这些虚线对齐。

【问题讨论】:

    标签: android popup


    【解决方案1】:

    注意:您应该使用PopupMenu 来达到您的目的

    1. 创建菜单 XML:
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/mute"
            android:orderInCategory="101"
            android:title="Mute"
            android:icon="@drawable/ic_baseline_volume_off_mute_24"
            android:iconTint="@color/text"
            app:showAsAction="never" />
        <item
            android:id="@+id/settings"
            android:orderInCategory="102"
            android:title="Settings"
            android:icon="@drawable/ic_baseline_settings_24"
            android:iconTint="@color/text"
            app:showAsAction="never" />
        <item
            android:id="@+id/share"
            android:orderInCategory="103"
            android:title="Share"
            android:icon="@drawable/ic_share"
            android:iconTint="@color/text"
            app:showAsAction="never" />
        <item
            android:id="@+id/leave"
            android:orderInCategory="104"
            android:title="Leave"
            android:icon="@drawable/ic_logout"
            android:iconTint="@color/text"
            app:showAsAction="never" />
    </menu>
    
    1. 显示弹出菜单的方法:
        private fun showPopupMenu() {
            val popup = PopupMenu(this, binding.layoutChatHeader.imageViewOptions)
    
            popup.apply {
                // inflate the popup menu
                menuInflater.inflate(R.menu.chat_channel_menu, menu)
    
                // popup menu item click listener
                setOnMenuItemClickListener {
                    when (it.itemId) {
                        R.id.mute ->                     
                            true
                        R.id.settings ->                     
                            true
                        R.id.leave -> {
                            removeUser()
                            true
                        }
                        else -> false
                    }
    
                    false
                }
            }
    
            // show icons on popup menu
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                popup.setForceShowIcon(true)
            } else {
                try {
                    val fields = popup.javaClass.declaredFields
                    for (field in fields) {
                        if ("mPopup" == field.name) {
                            field.isAccessible = true
                            val menuPopupHelper = field[popup]
                            val classPopupHelper =
                                Class.forName(menuPopupHelper.javaClass.name)
                            val setForceIcons: Method = classPopupHelper.getMethod(
                                "setForceShowIcon",
                                Boolean::class.javaPrimitiveType
                            )
                            setForceIcons.invoke(menuPopupHelper, true)
                            break
                        }
                    }
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
    
            // finally, show the popup menu
            popup.show()
        }
    
    1. 在需要的地方打开弹出菜单(例如 onClickListener):
    imageViewOptions.setOnClickListener {
                showPopupMenu()
            }
    

    【讨论】:

      【解决方案2】:

      好吧,你显示的是Dialog,而不是PopupWindow。而你实际上想显示ContextMenu

      使用registerForContextMenu 并传递三个点View

      然后覆盖 onCreateContextMenu 并扩展您的自定义菜单

      @Override  
      public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {  
          super.onCreateContextMenu(menu, v, menuInfo);  
          MenuInflater inflater = getMenuInflater();  
          inflater.inflate(R.menu.some_custom_menu, menu);  
          menu.setHeaderTitle("Some title");  
      }
      

      并处理点击:

      @Override  
      public boolean onContextItemSelected(MenuItem item){  
          if(item.getItemId()==R.id.custom_menu_item){
              //handle click here
              return true; //handled
          }
          return false; // not handled
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-23
        相关资源
        最近更新 更多