30

之前有人问过这个问题:AlertDialog custom title has black border

但没有得到令人满意的回答 - 并且缺少一些信息。


我正在尝试在 Android 中创建一个没有标题且底部没有任何按钮的自定义对话框。

但是,生成的对话框在视图的顶部和底部有黑色的“边框”/“间距”/一些东西。

文档

使用基本 Dialog 类创建的对话框必须有标题。如果您不调用 setTitle(),则用于标题的空间仍然是空的,但仍然可见。如果您根本不想要标题,那么您应该使用 AlertDialog 类创建自定义对话框。但是,由于使用 AlertDialog.Builder 类最容易创建 AlertDialog,因此您无法访问上面使用的 setContentView(int) 方法。相反,您必须使用 setView(View)。此方法接受一个 View 对象,因此您需要从 XML 扩展布局的根 View 对象。

所以,这就是我所做的:

欢迎.java

public class Welcome  extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.welcome);

        LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.welcomedialog, (ViewGroup)findViewById(R.id.layout_root));

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(layout);
        builder.create().show();
    }
}

欢迎对话框.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/texturebg"
              android:id="@+id/layout_root"
              android:orientation="vertical"
              android:padding="40px">
    ...
</LinearLayout>

注意:我尝试使用FrameLayout作为根ViewGroup而不是LinearLayout按照我在某处找到的建议使用 - 但这没有帮助。

结果

在此处输入图像描述 在此处输入图像描述


setBackgroundDrawable 建议

public class Welcome  extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.welcome);

        LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.welcomedialog, (ViewGroup)findViewById(R.id.layout_root));

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(layout);
        AlertDialog dialog = builder.create();

        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));

        dialog.show();
    }
}

没有为我工作。

4

5 回答 5

39

如果您查看AlertDialog 类源代码,您会发现大多数方法都是简单的代理方法(外观)private AlertController mAlert

查看AlertController 类源代码,您会看到 4 个有趣的成员变量:

private int mViewSpacingLeft;
private int mViewSpacingTop;
private int mViewSpacingRight;
private int mViewSpacingBottom;
private boolean mViewSpacingSpecified = false;

设置mViewSpacingSpecifiedtrue将删除对话框顶部和底部的边框。

这可以通过更改此行来正确完成:

dialog.setView(layout);

到:

dialog.setView(layout, 0, 0, 0, 0);
于 2012-05-11T18:38:16.780 回答
8
dialog.setInverseBackgroundForced(true);

在您的代码中使用上述内容来删除警报对话框的边框。

请参阅此链接以获取 InverseBackgroundForced。

更新试试这个代码::::

public class Welcome  extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.welcome);

        AlertDialog.Builder builder = new AlertDialog.Builder(Welcome.this);
        LayoutInflater _inflater = LayoutInflater.from(Welcome.this);
        View view = _inflater.inflate(R.layout.welcomedialog,null);
        builder.setView(view);

        AlertDialog alert = builder.create();
        alert.show();
    }
}

注意::也可以尝试从 welcomedialog.xml 中删除 android:padding="40px"。

于 2012-05-03T15:07:12.280 回答
5

就我而言,该边框是由 AlertDialog 的父 Activity 的主题引起的。要完全摆脱边框,请给它一个不同的主题(在本例中为 Holo):

AlertDialog.Builder builder = new AlertDialog.Builder(
                                new ContextThemeWrapper(this, android.R.style.Theme_Holo)
                              );

这为我修好了。希望这可以帮助!

于 2014-03-24T22:28:36.420 回答
1

只是为了让史蒂夫的回答更清楚,这很容易做到。例如,在我的情况下,我在对话框中设置的视图是 WebView。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    WebView webView = new WebView(getActivity());
    webView.loadUrl(" url to show ");


    OnClickListener clickListenerOk = new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            ...
        }
    };

    OnClickListener clickListenerCancel = new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            ...
        }
    };

    AlertDialog dialog = new AlertDialog.Builder(getActivity())

            .setPositiveButton("OK", clickListenerOk)

            .setNegativeButton("Cancel",clickListenerCancel)

            .create();

    dialog.setView(webView, 0, 0, 0, 0);

    return dialog;
}
于 2014-05-23T07:54:49.030 回答
0
setBackgroundDrawable(new ColorDrawable(0));

在你的对话框中调用它。

于 2012-05-03T14:48:09.797 回答