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

Posted

技术标签:

【中文标题】AlertDialog:如何删除视图上方和下方的黑色边框【英文标题】:AlertDialog: How To Remove Black Borders Above and Below View 【发布时间】:2012-05-13 02:36:44 【问题描述】:

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

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


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

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

来自the Documentation:

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

所以,这就是我所做的:

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_
              android:layout_
              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();
    

不适合我。

【问题讨论】:

这段代码可以使用 setPositiveButton 方法吗?如果我在布局中创建的新视图有按钮,如何设置 onClickListener 回调? @Fakebear,我认为您的评论/问题超出了这个问题的范围。您可能想要搜索该问题和/或提出一个新问题。 【参考方案1】:

如果您查看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);

【讨论】:

这个小编辑为我工作,谢谢! AlertDialog dialog = builder.create();dialog.setView(layout,0,0,0,0);dialog.show(); @Steve 非常感谢!经过数小时的研究,处理自定义主题和样式,我终于找到了解决我问题的答案! 一些小边框仍然留在这里,但更好。 @Steve 非常感谢我已经为这个问题奋斗了好几个小时... :) 显示此错误“AlertDialog.Builder 类型中的方法 setView(int) 不适用于参数 (View, int, int, int, int)”【参考方案2】:
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();
    

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

【讨论】:

这将黑色变为白色 - 但仍然留下空间。 False 使背景变黑 - 但仍然留下空间。【参考方案3】:

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

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

这为我解决了问题。希望这会有所帮助!

【讨论】:

这是对我有用的解决方案,使用自定义 DialogFragment【参考方案4】:

只是为了让史蒂夫的回答更清楚,这很容易做到。例如,在我的情况下,我在对话框中设置的视图是 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;

【讨论】:

【参考方案5】:
setBackgroundDrawable(new ColorDrawable(0));

在你的对话框中调用它。

【讨论】:

在对话框的窗口或视图上?

以上是关于AlertDialog:如何删除视图上方和下方的黑色边框的主要内容,如果未能解决你的问题,请参考以下文章

如何在expandablelistview中折叠组视图上方和下方的所有子视图?

如何删除 imageView 上方和下方的额外空间?

如何从输出中删除上方和下方的空行

如何消除我的 div 上方和下方的间隙? [复制]

iOS 通过故事板将 UIView 锁定在导航栏下方和 UITableView 上方

如何让表格视图滚动到图像视图上方?