Android:如何创建一个没有标题的对话框?

我试图在Android中生成一个自定义对话框。 我像这样创建我的Dialog:

dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);
除了对话框的标题外,一切都很好。 即使我没有设置对话框的标题,对话框弹出窗口在对话框的位置有一个空白。< / p >

有没有办法隐藏对话的这一部分?

我尝试了一个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);

如果我使用这段代码,我在最后一行得到一个空指针异常。对话框不是空的,所以我试图检索的TextView不存在 如果我取消注释我使用对话框构造函数的部分,一切正常,但我的对话框布局上面的标题

223983 次浏览

在代码中添加这一行

requestWindowFeature(Window.FEATURE_NO_TITLE);

或者在XML中使用主题

android:theme="@android:style/Theme.NoTitleBar"

XML将是一个更好的实现,因为在代码版本中,创建标题栏,然后删除,这是一种资源浪费

好的尝试,但它不工作。我 得到: android.view.WindowManager BadTokenException美元: 无法添加窗口——令牌为空 如果我想,也不是为了申请

.

.

将警报对话框类型更改为系统对话框(例如,TYPE_SYSTEM_OVERLAY),看看这是否解决了您的问题

你可以使用以下方法隐藏对话框的标题:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


这个答案的以前版本,太复杂了:

你需要使用AlertDialog。在Android开发者的网站上有一个关于自定义对话框的很好的解释。

简而言之,您可以使用以下从官方网站复制的代码来完成此操作。这需要一个自定义布局文件,膨胀它,给它一些基本的文本和图标,然后创建它。然后用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();

在回应评论时:

我假设id nr的TextView在你用View view = inflater....膨胀的视图中。如果是这样,那么你只需要改变一位:将dialog.findView...改为view.findView...。一旦你完成了这些,记得使用dialog.show(),甚至builder.show(),而不用费力使用builder.create()。

像这样使用:

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

这将从对话框窗口中删除任何标题栏。

您可以删除标题

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

其中dialog是我的对话框的名称。

FEATURE_NO_TITLE在从头创建对话框时起作用,如下所示:

Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

但在创建AlertDialog(或使用Builder)时,它不起作用,因为它已经禁用了标题,并在内部使用自定义标题。

我已经看过SDK源代码,我认为这是不可避免的。因此,要移除顶部间距,唯一的解决方案是通过直接使用dialog类从头开始创建一个自定义对话框。

同样,也可以通过样式来实现,例如在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);

将整个对话框的“gravity”属性设置为“center”。然后,您将需要覆盖对话框中所有不希望居中的子组件的设置。

使用生成器将标题设置为空字符串。

    Builder builder = new AlertDialog.Builder(context);
builder.setTitle("");
...
builder.show();

在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
}
}

在你的代码中,如果你使用requestWindowFeature(Window.FEATURE_NO_TITLE);,请确保它在dialog.setContentView();之前,否则会导致应用程序崩溃。

dialog=new Dialog(YourActivity.this, 1);  // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);

在XML中使用主题

android:theme="@android:style/Theme.NoTitleBar"
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
"Loading. Please wait...", true);

创建无标题对话框

olivierg的回答为我工作,是最好的解决方案,如果创建一个自定义Dialog类是你想走的路线。但是,我不能使用AlertDialog类,这让我很困扰。我希望能够使用默认的系统AlertDialog样式。创建自定义对话框类不会有这种风格。

所以我找到了一个解决方案(黑客),将工作,而不必创建一个自定义类,你可以使用现有的构建器。

AlertDialog将一个视图放在内容视图之上,作为标题的占位符。如果找到视图并将高度设置为0,空格就消失了。

到目前为止,我已经在2.3和3.0上测试了这个功能,它可能还不能在每个版本上工作。

这里有两个helper方法:

/**
* 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;
}

当我进一步测试时,我将确保更新所需的任何额外调整。

如果我们只是使用对话框而不使用setTitle(),那么它是否可以移除标题的空格?

mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();

我找到了三种方法

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"

经过一系列的黑客攻击,我得到了这个:

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

setcontentview之前使用以下代码:-

    Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);

请注意:你必须有上述代码,在相同的顺序和行。 requestWindowFeature必须是setContentView行之前

我不知道这个问题是否仍然存在,但在我的情况下,当我从Dialog切换到DialogFragment时,

requestWindowFeature(Window.FEATURE_NO_TITLE);

不是一个选择,但我可以用

setStyle(STYLE_NO_TITLE, 0);

结果是一样的。

我想你现在可以用这个了:

AlertDialog dialog = new AlertDialog.Builder(this)
.setView(view)
.setTitle("")
.create()

你可以在不使用AlertDialog的情况下,通过定义从Dialog类扩展而来的新类来做到这一点,如下所示:

public class myDialog extends Dialog {
public myDialog(Context context) {
super(context);
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
}
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();
}

下面是你可以用AlertBuilder做的事情来让标题消失:

TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);

当使用AlertDialog时,不使用setTitle()会使标题消失

使用这个

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

dialog_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);

这将从剪切对话框中删除标题。

注意在添加内容之前先添加这些行。对如

     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)

I try requestWindowFeature(Window.FEATURE_NO_TITLE) 但是不工作对我来说,如果你像我一样所以这样做:

向对话框传递主题可以为您删除标题栏。

    <style name="NoTitleDialog" parent="Theme.AppCompat.Dialog">
<item name="android:windowNoTitle">true</item>
</style>

将主题传递给你的对话框:

对话框对话框=新的对话框(这个,R.style.NoTitleDialog);

这很简单