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中折叠组视图上方和下方的所有子视图?