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