276

我正在尝试在 Android 中生成自定义对话框。我像这样创建我的对话框:

dialog = new Dialog(this);
dialog.setContentView(R.layout.my_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);

如果我使用此代码,我会在最后一行得到一个空指针异常。该对话框不为空,因此我尝试检索的 TextView 不存在。
如果我取消注释我使用对话框构造器的部分,一切正常,但对于我的对话框布局上方的标题。

4

26 回答 26

587

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);
于 2010-08-04T16:58:50.090 回答
213

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

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


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

您需要使用AlertDialog. 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();

回应评论:

我假设带有 idnr的 TextView 在你正在膨胀的 View 中View view = inflater....。如果是这样,那么您只需要更改一点:而不是dialog.findView...make it view.findView...。然后,一旦你这样做了,记得使用 dialog.show(),甚至是 builder.show(),而不必费心去做 builder.create()。

于 2010-04-15T09:54:47.707 回答
68

在您的代码中添加这一行

requestWindowFeature(Window.FEATURE_NO_TITLE);  

或者在 XML 中使用主题

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

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

好的,很好的尝试,但它不起作用。我得到: android.view.WindowManager$BadTokenException: Unable to add window - 如果我想显示对话框,则令牌 null 不适用于应用程序。

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

于 2010-04-15T09:43:07.643 回答
61

像这样使用:

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

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

于 2010-06-16T13:43:54.590 回答
58

在之前使用以下代码setcontentview:-

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

注意:您必须具有上述代码,顺序和行相同。 requestWindowFeature必须setContentView 行之前。

于 2013-02-02T11:02:11.197 回答
38

您可以通过以下方式删除标题

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

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

于 2010-08-03T07:04:08.840 回答
29

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

于 2011-08-09T23:11:16.453 回答
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 
    }
}
于 2011-08-08T19:38:30.783 回答
10

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

1) 使用 requestWindowFeature

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

2)使用样式(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"
于 2012-11-27T06:28:10.320 回答
7

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

所以我找到了一个无需创建自定义类即可工作的解决方案(hack),您可以使用现有的构建器。

AlertDialog 在您的内容视图上方放置一个视图作为标题的占位符。如果您找到视图并将高度设置为 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;
}

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

于 2012-03-31T21:18:39.330 回答
6

我不知道这个问题是否仍然存在,但就我而言,当我从 Dialog 切换到 DialogFragment 时,

requestWindowFeature(Window.FEATURE_NO_TITLE);

不是一种选择,但我可以使用

setStyle(STYLE_NO_TITLE, 0);

而是得到相同的结果。

于 2013-03-12T13:13:38.977 回答
4

使用 builder 将标题设置为空字符串。

    Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("");
...
    builder.show();
于 2011-08-05T17:00:36.297 回答
3

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

于 2011-07-03T19:47:45.820 回答
3

在 XML 中使用主题

android:theme="@android:style/Theme.NoTitleBar"
于 2012-02-29T07:55:21.897 回答
3
dialog=new Dialog(YourActivity.this, 1);  // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);
于 2012-02-15T12:28:33.660 回答
3

如果我们只是使用没有 的对话框setTitle(),那么这是否可以删除标题的空格?

mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();
于 2012-06-07T06:25:41.953 回答
3

认为您现在可以使用它:

AlertDialog dialog = new AlertDialog.Builder(this)
  .setView(view)
  .setTitle("")
  .create()
于 2013-10-02T19:53:31.913 回答
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(); 
     }
于 2015-01-09T12:10:24.043 回答
2
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                             "Loading. Please wait...", true);

创建一个无标题对话框

于 2012-03-14T02:45:15.083 回答
2

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

于 2015-08-04T07:09:07.813 回答
1

您可以不使用AlertDialog通过定义从DialogClass 扩展的新类来做到这一点,如下所示:

public class myDialog extends Dialog {
    public myDialog(Context context) {
        super(context);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
}
于 2014-09-08T17:00:58.407 回答
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);
于 2012-12-07T22:37:10.353 回答
1

您可以使用AlertBuilder以下方法使标题消失:

TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);
于 2015-06-27T04:48:27.140 回答
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);
于 2017-01-31T14:17:49.347 回答
1

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)
于 2019-03-01T11:36:46.670 回答
0

我尝试 requestWindowFeature(Window.FEATURE_NO_TITLE);
但不为我工作,如果你像我一样这样做

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

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

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

对话框 dialog = new Dialog(this, R.style.NoTitleDialog);

这很简单

于 2022-01-31T14:30:16.040 回答