AlertDialog:如何删除视图上方和下方的黑色边框

时间:2012-05-03 14:45:36

标签: android android-layout android-dialog

之前已经问过这个问题:AlertDialog custom title has black border

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


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

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

来自the Documentation

  

使用基本Dialog类创建的对话框必须具有标题。如果你   不要调用setTitle(),那么用于标题的空间仍然存在   空的,但仍然可见。如果你根本不想要一个标题,那么你   应该使用AlertDialog类创建自定义对话框。然而,   因为使用AlertDialog.Builder创建的AlertDialog最简单   在类中,您无权访问使用的setContentView(int)方法   以上。相反,您必须使用setView(View)。此方法接受视图   对象,因此您需要从XML中扩展布局的根View对象。

所以,这就是我所做的:

Welcome.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();
    }
}

welcomedialog.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根据我在某处找到的建议 - 但是没有救命。

结果

enter image description here enter image description here


setBackgroundDrawable Suggestion

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();
    }
}

对我不起作用。

5 个答案:

答案 0 :(得分:39)

如果查看AlertDialog class source,您会看到大多数方法只是private AlertController mAlert周围的代理方法(外观)。

查看AlertController class source,您会看到4个有趣的成员变量:

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

mViewSpacingSpecified设置为true将删除对话框顶部和底部的边框。

通过更改此行正确完成此操作:

dialog.setView(layout);

为:

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

答案 1 :(得分:8)

dialog.setInverseBackgroundForced(true);

在代码中使用以上内容删除警告对话框的边框。

请参阅此LINK以获取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();
    }
}

注意:: 还可以尝试从welcomeialog.xml中删除android:padding =“40px”。

答案 2 :(得分:6)

在我的情况下,该边框是由AlertDialog的父Activity的主题引起的。要彻底摆脱边界,请给它一个不同的主题(在这种情况下,Holo):

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

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

答案 3 :(得分: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;
}

答案 4 :(得分:0)

setBackgroundDrawable(new ColorDrawable(0));

在对话框中调用此方法。