无法在Android中使用自定义视图更改AlertDialog的宽度

时间:2016-01-28 12:30:16

标签: android android-alertdialog

我绝对是Android的初学者。现在我遇到了在Android中使用自定义视图设置默认AlertDialog宽度的问题。它没有调整警报对话框的宽度。我的代码出了什么问题?

这是我的提醒对话框的视图布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="match_parent">
    <android.support.v7.widget.AppCompatButton
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:textColor="@color/white"
        app:backgroundTint="@color/green"
        android:layout_gravity="center_horizontal"
        android:id="@+id/btn_row_option_done"
        android:text="Done"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <android.support.v7.widget.AppCompatButton
        android:textColor="@color/white"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        app:backgroundTint="@color/lightBlue"
        android:layout_gravity="center_horizontal"
        android:text="Edit"
        android:id="@+id/btn_row_option_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <android.support.v7.widget.AppCompatButton
        android:textColor="@color/white"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        app:backgroundTint="@color/red"
        android:layout_gravity="center_horizontal"
        android:text="Delete"
        android:id="@+id/btn_row_option_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <android.support.v7.widget.AppCompatButton
        xmlns:app="http://schemas.android.com/apk/res-auto"
        app:backgroundTint="@color/white"
        android:layout_gravity="center_horizontal"
        android:text="Cancel"
        android:id="@+id/btn_row_option_cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

如您所见,我将linearLayout的宽度设置为wrap_content。

这就是我在Java代码中打开警告对话框的方法

public void showOptionDialog(final int id)
    {
        LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
        View view = layoutInflater.inflate(R.layout.row_option_dialog, null);

        final AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();
        Boolean isTaskDone = dbHelper.isTaskDone(id);
        Button doneBtn = (Button)view.findViewById(R.id.btn_row_option_done);
        if(isTaskDone==false)
        {
            doneBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dbHelper.markAsDone(id);
                    refreshListView();
                    alertDialog.cancel();
                    Toast.makeText(getActivity().getBaseContext(),"Marked as done",Toast.LENGTH_SHORT).show();
                }
            });
        }
        else{
            ViewGroup viewGroup = (ViewGroup)doneBtn.getParent();
            viewGroup.removeView(doneBtn);
        }
        Button editBtn = (Button)view.findViewById(R.id.btn_row_option_edit);
        if(isTaskDone==false)
        {
            editBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    MainActivity activity = (MainActivity) getActivity();
                    activity.replaceEditTaskFragment(id);
                    alertDialog.cancel();
                }
            });
        }
        else{
            ViewGroup viewGroup = (ViewGroup)editBtn.getParent();
            viewGroup.removeView(editBtn);
        }
        Button deleteBtn = (Button)view.findViewById(R.id.btn_row_option_delete);
        deleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dbHelper.deleteTask(id);
                items.remove(optionFocusedItemIndex);
                adapter.notifyDataSetChanged();
                Toast.makeText(getActivity().getBaseContext(),"Task deleted",Toast.LENGTH_SHORT).show();
                alertDialog.cancel();
                updateListEmptyText();
            }
        });
        Button cancelBtn = (Button)view.findViewById(R.id.btn_row_option_cancel);
        cancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertDialog.cancel();
            }
        });
        alertDialog.setView(view);
        alertDialog.show();
    }

但是当打开警告对话框时,其宽度不会调整大小,仍然显示默认大小,如屏幕截图所示。

这是截图。

enter image description here

正如你所看到的,即使我设置为wrap_content,宽度几乎已满屏幕。我也设置了类似300px的东西。它不起作用。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

首先为容器制作其他布局,然后在其内部使用换行内容进行此线性布局。之后,您可以使容器的alpha背景几乎为0,使其透明。内部布局中包含按钮的对话框。对于自定义对话框,您无法使用此AlertDialog,使您自己的活动行为就像一个对话框。

答案 1 :(得分:0)

在此设置所需的大小 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="300px" android:layout_height="match_parent">......</LinearLayout>

alertDialog.show(); alertDialog.getWindow().setLayout(300, 300);

答案 2 :(得分:0)

更改此行

alertDialog.setView(view);

alertDialog.setContentView(view);

此处视图是自定义布局的实例。