2

我有一个带有可检查菜单项的溢出菜单。我想一直对齐CheckBox到最后,但我不知道如何做到这一点。

我的菜单定义如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:icon="@drawable/ic_baseline_more_vert_24"
        android:title=""
        app:showAsAction="always">
        <menu>
            <item
                android:id="@+id/desktop_site"
                android:checkable="true"
                android:checked="false"
                android:icon="@drawable/ic_baseline_desktop_windows_24"
                android:title="Desktop site"
                app:showAsAction="never" />
        </menu>
    </item>
</menu>

溢出菜单

4

2 回答 2

2

您可以创建自定义样式CheckBox并使用负值调整结束填充:

<style name="checkbox_style" parent="android:style/Widget.Holo.Light.CompoundButton.CheckBox">
    <item name="android:paddingRight">-7dp</item>
</style>

并将其应用于您应用的主题:

<item name="checkboxStyle">@style/checkbox_style</item>

在此处输入图像描述

注意:默认情况下,菜单项周围应该有一些边距;所以你不能把它发送checkBox到远端,因为它的右边缘会被切断:

使用 -8dp 时:

在此处输入图像描述

所以,你需要小心处理这个问题。

更新

但它会影响CheckBoxes我的应用程序中的所有内容

这需要CheckBoxes在您的所有布局中反转此填充;并且有以下选项:

  • 第一个选项:android:paddingRight="7dp"/添加android:paddingEnd="7dp"到所有CheckBoxes.
  • 第二种选择:创建一个自定义CheckBox类并将这个填充添加到它的构造函数中;并使用此自定义 CheckBox 而不是默认值CheckBox
public class MyCheckBox extends AppCompatCheckBox {

    public MyCheckBox(Context context) {
        super(context);
        init();
    }

    public MyCheckBox(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        int px = (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP,
                7f, // dp value
                getResources().getDisplayMetrics()
        );
        setPadding(0, 0, px, 0);
    }

    public MyCheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }


}

并使用它:

<!-- Add the full path of the customized CheckBox -->
<com.example.android......MyCheckBox   
    android:id="@+id/checkbox2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
/>

提示:如果您以 API-17+ 为目标,请android:paddingEnd改用android:paddingRight

于 2021-10-23T00:20:09.317 回答
0

您可以使用自定义PopupWindow. 这使您可以完全自定义它。首先为您的 Popup 创建一个 XML 文件。在主布局中使用wrap_content对于将弹出窗口缩小到其大小非常重要。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="#000000"
        android:padding="5dp"
        android:gravity="center_vertical">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_baseline_desktop_mac_24"
            app:tint="#FFFFFF"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Desktop site"
            android:textColor="#FFFFFF"
            android:layout_marginLeft="10dp"/>

        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="#FFFFFF"
            android:minWidth="0dp"
            android:minHeight="0dp"
            android:layout_marginLeft="30dp"/>

    </LinearLayout>

</LinearLayout>

在此处输入图像描述

然后通过调用此函数显示对话框。(我从我的一个项目中复制了这段代码,但我记得我是从 SO 那里得到的)。

private void showPopup(Context context, Point p) {
    LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View layout = layoutInflater.inflate(R.layout.your_popup_xml, null);
    
    PopupWindow changeStatusPopUp = new PopupWindow(context);
    changeStatusPopUp.setContentView(layout);
    changeStatusPopUp.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT);
    changeStatusPopUp.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
    changeStatusPopUp.setAnimationStyle(android.R.style.Animation_Dialog);

    int OFFSET_X = -300; //Adjust position of the Popup
    int OFFSET_Y = 50;   //Adjust position of the Popup
        
    changeStatusPopUp.setOutsideTouchable(true);
    changeStatusPopUp.setFocusable(true);
    changeStatusPopUp.setBackgroundDrawable(new BitmapDrawable());
    changeStatusPopUp.showAtLocation(layout, Gravity.NO_GRAVITY, p.x + OFFSET_X, p.y + OFFSET_Y);
}

如果你想捕捉 Click 事件,你只需要在 Java 中设置 anid并将LinearLayout其与viewJava ( LinearLayout ll = view.findViewById(R.id.yourId);) 一起使用。

通过以下方式调用 void:

int[] location = new int[2];
view.getLocationOnScreen(location);
Point point = new Point();
point.x = location[0];
point.y = location[1];
showStatusPopup(context, point);
于 2021-10-23T01:16:23.500 回答