我正在尝试在Android中生成自定义对话框。 我像这样创建对话框:
dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);
除了Dialog的标题外,Everythings工作正常。 即使我没有设置对话框的标题,对话框弹出窗口在对话框的位置也有一个空格。
有没有办法隐藏Dialog的这一部分?
我尝试使用AlertDialog,但似乎布局设置不正确:
LayoutInflater inflater =
(LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.map_dialog, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);
// dialog = new Dialog(this);
// dialog.setContentView(R.layout.map_dialog);
dialog = builder.create();
((TextView) dialog.findViewById(R.id.nr)).setText(number);
如果我使用这段代码,我会在最后一行得到一个空指针异常。该对话框不为null,因此我尝试检索的TextView不存在 如果我取消注释我使用Dialog构造函数的部分,一切正常,但对于我的对话框布局上方的标题。
答案 0 :(得分:584)
FEATURE_NO_TITLE有效,如:
Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
但是在创建AlertDialog(或使用Builder)时它不起作用,因为它已经禁用了标题并在内部使用了自定义标题。
我查看了SDK源代码,我认为它无法解决。因此,要删除顶部间距,唯一的解决方案是直接使用Dialog类从头开始创建IMO自定义对话框。
此外,可以使用样式来实现,例如在styles.xml中:
<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
</style>
然后:
Dialog dialog = new Dialog(context, R.style.FullHeightDialog);
答案 1 :(得分:201)
您可以使用以下方式隐藏对话框的标题:
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
此答案的早期版本,过于复杂:
您需要使用AlertDialog
。关于custom dialogs,Android开发者网站上有一个很好的解释。
在非常简短的总结中,您可以使用以下从官方网站复制的代码执行此操作。这需要一个自定义的layot文件,膨胀它,给它一些基本的文本和图标,然后创建它。然后使用alertDialog.show()
显示它。
AlertDialog.Builder builder;
AlertDialog alertDialog;
Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater)
mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
(ViewGroup) findViewById(R.id.layout_root));
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);
builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();
回应评论:
我认为标识为nr
的TextView位于您正在使用View view = inflater....
充气的视图中。如果是这样,那么您只需更改一位:而不是dialog.findView...
使其成为view.findView...
。然后,一旦你完成了这个,记得使用dialog.show(),甚至是builder.show(),而不必费心去做builder.create()。
答案 2 :(得分:67)
在您的代码中添加此行
requestWindowFeature(Window.FEATURE_NO_TITLE);
或者在XML中使用主题
android:theme="@android:style/Theme.NoTitleBar"
XML将是一个更好的实现,因为标题栏的代码版本被创建然后删除,这是浪费资源
好的尝试,但它不起作用。一世 得到: android.view.WindowManager $ BadTokenException: 无法添加窗口 - 令牌null为 如果我愿意,不适合申请 对话框。
将警报对话框类型更改为系统对话框(例如,TYPE_SYSTEM_OVERLAY)并查看这是否可以解决您的问题
答案 3 :(得分:60)
像这样使用:
Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
这将从对话框窗口中删除任何标题栏。
答案 4 :(得分:58)
在setcontentview
之前使用以下代码: -
Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);
注意:您必须拥有相同顺序和行的上述代码。
requestWindowFeature
必须在之前 setContentView行。
答案 5 :(得分:38)
您可以通过
删除标题dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
其中对话框是我的对话框的名称。
答案 6 :(得分:29)
在您的代码中,如果您使用requestWindowFeature(Window.FEATURE_NO_TITLE);
,请确保它在dialog.setContentView();
之前,否则会导致应用程序崩溃。
答案 7 :(得分:10)
我找到了三种方法来做这个&gt;
1)使用requestWindowFeature
Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(dialog.getWindow().FEATURE_NO_TITLE);
2)使用style(style.xml)
<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
</style>
Dialog dialog = new Dialog(context, R.style.FullHeightDialog);
3)在AndroidManifest.xml中使用XML主题
android:theme="@android:style/Theme.NoTitleBar"
答案 8 :(得分:10)
在Custom_Dialog.java类中添加requestWindowFeature(Window.FEATURE_NO_TITLE)
public class Custom_Dialog extends Dialog {
protected Custom_Dialog(Context context, int theme) {
super(context, theme);
// TODO Auto-generated constructor stub
requestWindowFeature(Window.FEATURE_NO_TITLE); //This line
}
}
答案 9 :(得分:7)
olivierg's answer为我工作,如果创建自定义Dialog类是您想要的路线,那么它是最好的解决方案。但是,我无法使用AlertDialog类。我希望能够使用默认的系统AlertDialog样式。创建自定义对话框类不会有这种风格。
因此,我找到了一个无需创建自定义类即可使用的解决方案(hack),您可以使用现有的构建器。
AlertDialog将View放在内容视图上方作为标题的占位符。如果找到视图并将高度设置为0,则空间消失。
到目前为止,我已经在2.3和3.0上对此进行了测试,但它可能无法在每个版本上运行。
以下是两种辅助方法:
/**
* Show a Dialog with the extra title/top padding collapsed.
*
* @param customView The custom view that you added to the dialog
* @param dialog The dialog to display without top spacing
* @param show Whether or not to call dialog.show() at the end.
*/
public static void showDialogWithNoTopSpace(final View customView, final Dialog dialog, boolean show) {
// Now we setup a listener to detect as soon as the dialog has shown.
customView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Check if your view has been laid out yet
if (customView.getHeight() > 0) {
// If it has been, we will search the view hierarchy for the view that is responsible for the extra space.
LinearLayout dialogLayout = findDialogLinearLayout(customView);
if (dialogLayout == null) {
// Could find it. Unexpected.
} else {
// Found it, now remove the height of the title area
View child = dialogLayout.getChildAt(0);
if (child != customView) {
// remove height
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams();
lp.height = 0;
child.setLayoutParams(lp);
} else {
// Could find it. Unexpected.
}
}
// Done with the listener
customView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
// Show the dialog
if (show)
dialog.show();
}
/**
* Searches parents for a LinearLayout
*
* @param view to search the search from
* @return the first parent view that is a LinearLayout or null if none was found
*/
public static LinearLayout findDialogLinearLayout(View view) {
ViewParent parent = (ViewParent) view.getParent();
if (parent != null) {
if (parent instanceof LinearLayout) {
// Found it
return (LinearLayout) parent;
} else if (parent instanceof View) {
// Keep looking
return findDialogLinearLayout((View) parent);
}
}
// Couldn't find it
return null;
}
以下是如何使用它的示例:
Dialog dialog = new AlertDialog.Builder(this)
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, true);
如果您使用DialogFragment,请覆盖DialogFragment的onCreateDialog
方法。然后像上面的第一个例子一样创建并返回对话框。唯一的变化是你应该传递false作为第三个参数(show),这样它就不会在对话框上调用show()。 DialogFragment将在稍后处理。
示例:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getContext())
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, false);
return dialog;
}
当我进一步测试时,我将确保更新所需的任何额外调整。
答案 10 :(得分:6)
我不知道这个问题是否仍然存在,但就我而言,当我从Dialog切换到DialogFragment时,
requestWindowFeature(Window.FEATURE_NO_TITLE);
不是一个选项,但我可以使用
setStyle(STYLE_NO_TITLE, 0);
取而代之的是相同的结果。
答案 11 :(得分:4)
使用构建器将标题设置为空字符串。
Builder builder = new AlertDialog.Builder(context);
builder.setTitle("");
...
builder.show();
答案 12 :(得分:3)
使用主题
android:theme="@android:style/Theme.NoTitleBar"
答案 13 :(得分:3)
dialog=new Dialog(YourActivity.this, 1); // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);
答案 14 :(得分:3)
如果我们只使用没有setTitle()
的对话框,那么是否可以删除标题空间?
mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();
答案 15 :(得分:3)
将整个对话框的“gravity”属性设置为“center”。然后,您需要将该设置覆盖到对话框中您不想居中的所有子组件。
答案 16 :(得分:3)
认为你现在可以使用它:
AlertDialog dialog = new AlertDialog.Builder(this)
.setView(view)
.setTitle("")
.create()
答案 17 :(得分:2)
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
"Loading. Please wait...", true);
创建一个无标题对话框
答案 18 :(得分:2)
public static AlertDialog showAlertDialogWithoutTitle(Context context,String msg)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setMessage(msg).setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
return alertDialogBuilder.create();
}
答案 19 :(得分:2)
使用AlertDialog时,不使用setTitle()
会使标题消失
答案 20 :(得分:1)
经过一堆黑客攻击,我得到了这个工作:
Window window = dialog.getWindow();
View view = window.getDecorView();
final int topPanelId = getResources().getIdentifier( "topPanel", "id", "android" );
LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId);
topPanel.setVisibility(View.GONE);
答案 21 :(得分:1)
您可以在不使用AlertDialog
的情况下执行此操作,方法是定义从Dialog
类扩展的新类,如下所示:
public class myDialog extends Dialog {
public myDialog(Context context) {
super(context);
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
}
答案 22 :(得分:1)
您可以使用AlertBuilder
来完成标题消失:
TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);
答案 23 :(得分:1)
使用此
Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.setCancelable(true);
dialog.setContentView(R.layout.image_show_dialog_layout);
答案 24 :(得分:0)
dialog_custom .requestWindowFeature(Window.FEATURE_NO_TITLE);
这将从cutsom对话框中删除标题。
请注意在添加内容之前添加这些行。例如
dialog_custom = Dialog(activity!!)
dialog_custom.requestWindowFeature(Window.FEATURE_NO_TITLE)
dialog_custom.setContentView(R.layout.select_vehicle_type)
dialog_custom.setCanceledOnTouchOutside(false)
dialog_custom.setCancelable(true)