使对话框宽度与自定义正按钮宽度

时间:2015-11-18 13:19:18

标签: android

我正在为这样的对话框使用自定义布局:

public Dialog onCreateDialog(Bundle savedInstanceState) {

    Builder builder = new Builder(getActivity());
    View dialogView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_code_dialog, null);
    builder.setView(dialogView);

    builder.setPositiveButton("", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {
            listener.onDialogPositiveClick(CodeDialogFragment.this);
        }
    });
    return builder.create();
}

使用这个xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context="XXX.fragments.CodeDialogFragment">

    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:text="@string/code_text"
    android:padding="@dimen/medium_body_padding"
    android:id="@+id/code_text"
    />
</RelativeLayout>

我正在通过覆盖对话框片段上的onStart()方法替换标准的正面按钮:

@Override
public void onStart(){
    super.onStart();
    //replace default button with image

    Button button = ((AlertDialog) getDialog()).getButton(DialogInterface.BUTTON_POSITIVE);
    button.setBackground(ContextCompat.getDrawable(this.getActivity(), R.drawable.copy_and_open_btn));
}

我的问题是我的设计需要对话框与按钮的宽度相同,但是当按钮被覆盖时,将宽度设置为wrap_content并不起作用。如何在更换按钮后更改对话框的宽度以匹配按钮宽度?

更新

我已设法通过将此对话框添加到onStart()方法来更改对话框的宽度:

    int width = button.getBackground().getIntrinsicWidth();
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.copyFrom(getDialog().getWindow().getAttributes());
    lp.width = width;
    getDialog().getWindow().setAttributes(lp);

这会更改对话框的宽度,但会缩小按钮以保留填充。我无法解决填充来自哪里。

2 个答案:

答案 0 :(得分:1)

如果您没有为正面按钮设置皮肤,但是整个Dialog是自定义的,那该怎么办?

final Dialog dialog = new Dialog(getContext());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.fragment_code_dialog);

Button doneButton = (Button) dialog.findViewById(R.id.done_button);
doneButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        listener.onDialogPositiveClick(CodeDialogFragment.this);
        dialog.dismiss();
    }
});

dialog.show();

在这种情况下,您的正面按钮(R.id.done_button)是布局中的一个按钮(R.layout.fragment_code_dialog)。您可以完全按照设计布局视图和按钮,并将其作为一个整体使用,而不必为正面按钮设置外观。

答案 1 :(得分:1)

只需设置

getWindow().setLayout(int width,int height)` immediately after `show()

例如。

AlertDialog.Builder builder = new AlertDialog.Builder(this);
//do other operations like inflating layout,setTile etc here
builder.show().getWindow().setLayout(600,900);'