以编程方式 AlertDialog 上的复选框不获取中心重力

CheckBox on Programmatically AlertDialog Don't Get Center Gravity

我正在创建一个仅使用代码的 AlertDialog 并为复选框插入一个视图。但是检查具有奇怪的重力行为。

如何将文本+框放在中间或至少将文本放在左侧并开始填充。

谢谢。

private void openFilterDialog() {
    final AlertDialog.Builder builder = new AlertDialog.Builder(Objects.requireNonNull(getContext()));
    builder.setTitle(getString(R.string.filter));

    // Set up the input
    final CheckBox hideNoResponseBox = new CheckBox(getContext());
    //Put the checkBox on the right side
    hideNoResponseBox.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
    hideNoResponseBox.setText(R.string.hide_no_responses);
    hideNoResponseBox.setChecked(hideNoResponse);
    hideNoResponseBox.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
    hideNoResponseBox.setGravity(View.TEXT_ALIGNMENT_CENTER);

    builder.setView(hideNoResponseBox);

    // Set up the buttons
    builder.setPositiveButton(getString(R.string.do_filter), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (Utils.isDoubleClick()) return;
            hideNoResponse = hideNoResponseBox.isChecked();

            showLoadingDialog(true);
            hideListItem(adapter.getDistanceArrayList());
            dialog.dismiss();
        }
    });
    builder.setNegativeButton(getString(R.string.str_cancel), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });

    builder.show();
}

继承自Viewclass的CheckBox的setGravity()方法,取Gravity个常量作为值。

https://developer.android.com/reference/android/view/Gravity

编辑:

您可以尝试使用布局参数设置文本引力。 AlertDialog 的 LayoutParams 是 LinearLayout 的 LayoutParams,如下所述:

你只需要使用 LayoutParam 的 setGravity() 方法。

关于填充,您可以尝试将 CheckBox 的父级转换为 ViewGroup 并在那里设置填充,如下所示:

private void openFilterDialog() {
    final AlertDialog.Builder builder = new AlertDialog.Builder(Objects.requireNonNull(getContext()));
    builder.setTitle(getString(R.string.filter));

    // Set up the input
    final CheckBox hideNoResponseBox = new CheckBox(getContext());
    //Put the checkBox on the right side
    hideNoResponseBox.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
    hideNoResponseBox.setText(R.string.hide_no_responses);
    hideNoResponseBox.setChecked(hideNoResponse);
    hideNoResponseBox.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);

    hideNoResponseBox.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
    hideNoResponseBox.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);

    int px = Math.round(TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics()));

    hideNoResponseBox.setPadding(px,0,0,0);

    builder.setView(hideNoResponseBox);


    // Set up the buttons
    builder.setPositiveButton(getString(R.string.do_filter), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (Utils.isDoubleClick()) return;
            hideNoResponse = hideNoResponseBox.isChecked();

            showLoadingDialog(true);
            hideListItem(adapter.getDistanceArrayList());
            dialog.dismiss();
        }
    });
    builder.setNegativeButton(getString(R.string.str_cancel), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });

    builder.show();
}