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

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

dialog = new Dialog(this); dialog.setContentView(R.layout.my_dialog); 

除了对话框的标题外,万物都可以正常工作。 即使我没有设置对话框的标题,对话框popup窗口在对话框的位置上也有一个空白区域。

有什么办法可以隐藏这部分的对话框?

我试着用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); 

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

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

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


此答案的以前版本过于复杂:

您需要使用AlertDialog 。 Android Developer的网站上有一个关于自定义对话框的很好的解释。

在非常简短的总结中,您可以使用下面从官方网站复制的代码。 这需要一个自定义的layot文件,膨胀它,给它一些基本的文字和图标,然后创build它。 你会用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()。

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

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

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

我已经看了SDK的来源,我认为这是无法解决的。 因此,要删除顶部间距,唯一的解决scheme是直接使用Dialog类从IMO创build一个自定义对话框。

另外,可以使用style.xml来做到这一点,例如在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); 

在你的代码中添加这一行

 requestWindowFeature(Window.FEATURE_NO_TITLE); 

或者在XML中使用一个主题

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

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

好的尝试,但它不工作。 我得到:android.view.WindowManager $ BadTokenException:无法添加窗口 – 标记null不是为应用程序,如果我想shwo对话框。

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

像这样使用:

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

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

setcontentview之前使用下面的代码: –

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

注意 :您必须具有上面的代码,按照相同的顺序和行。 requestWindowFeature必须位于setContentView行之前

你可以通过删除标题

 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

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

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

我find了三种方法来做到这一点

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" 

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

olivierg的答案为我工作,是最好的解决scheme,如果创build一个自定义的Dialog类是你想去的路线。 然而,这使我不能使用AlertDialog类困扰我。 我想能够使用默认的系统AlertDialog风格。 创build自定义对话框类不会有这种风格。

所以我find了一个解决scheme(黑客),将无需创build自定义类,您可以使用现有的build设者。

AlertDialog将视图置于内容视图上方作为标题的占位符。 如果您发现视图并将高度设置为0,则空间将消失。

到目前为止,我已经在2.3和3.0版本上testing了这个版本,但是它可能不适用于每个版本。

这里有两个辅助方法:

 /** * 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方法。 然后像上面的第一个例子一样创build并返回对话框。 唯一的变化是你应该传递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; } 

随着我进一步testing,我会确保更新所需的任何额外的调整。

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

 requestWindowFeature(Window.FEATURE_NO_TITLE); 

不是一个select,但我可以使用

 setStyle(STYLE_NO_TITLE, 0); 

取而代之的是相同的结果。

使用生成器将标题设置为空string。

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

将整个对话框的“重力”属性设置为“中心”。 然后,您需要将该设置覆盖到您不想居中的对话框中的所有子组件。

 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" 

如果我们只是使用没有setTitle()的对话框,那么是否会去除标题的空间?

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

认为你现在可以使用这个:

 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); } } 
 ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", "Loading. Please wait...", true); 

创build一个无标题对话框

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

在一堆黑客之后,我得到了这个工作:

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