Android: Как создать диалог без заголовка?
Я пытаюсь создать пользовательский диалог в 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, который я пытаюсь получить, не существует.
Если я раскомментирую ту часть, где я использую Dialog Constructor, все работает отлично, но для заголовка над моим диалоговым макетом.
Ответы
Ответ 1
Скрыть заголовок диалогового окна можно с помощью:
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();
В ответ на комментарий:
Я предполагаю, что TextView с id nr
находится в представлении, которое вы раздуваете с помощью View view = inflater....
. Если это так, вам нужно изменить только один бит: вместо dialog.findView...
сделать его view.findView...
. Затем, как только вы это сделаете, не забудьте использовать dialog.show() или даже builder.show(), не беспокоясь о том, что делать builder.create().
Ответ 2
FEATURE_NO_TITLE работает при создании диалога с нуля, как в:
Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Но он не работает при создании AlertDialog (или с помощью Builder), поскольку он уже отключает заголовок и использует пользовательский интерфейс внутри.
Я просмотрел источники SDK, и я думаю, что это невозможно обойти. Таким образом, чтобы удалить верхний интервал, единственным решением является создание настраиваемого диалога с нуля IMO, непосредственно используя класс 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);
Ответ 3
В коде добавьте эту строку
requestWindowFeature(Window.FEATURE_NO_TITLE);
Или в XML используйте тему
android:theme="@android:style/Theme.NoTitleBar"
XML будет лучшей реализацией, так как с версией кода строка заголовка создается, а затем удаляется, что является пустой тратой ресурсов
Хорошо, хорошо, но он не работает. я получить: android.view.WindowManager $BadTokenException: Невозможно добавить нулевой токен окна не для приложения, если я хочу shwo диалог.
Измените тип диалогового окна оповещения в системном диалоге (например, TYPE_SYSTEM_OVERLAY) и проверьте, не устраняет ли это проблему.
Ответ 4
Используйте это:
Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Это приведет к удалению любой строки заголовка из диалогового окна.
Ответ 5
Используйте код ниже setcontentview
: -
Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);
Примечание. У вас должен быть код выше, в том же порядке и в строке.
requestWindowFeature
должен быть до строки setContentView.
Ответ 6
вы можете удалить заголовок
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
где диалог - это имя моего диалога.
Ответ 7
В вашем коде, если вы используете requestWindowFeature(Window.FEATURE_NO_TITLE);
, убедитесь, что он идет до dialog.setContentView();
, иначе это приведет к сбою приложения.
Ответ 8
Я нашел три способа сделать это >
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) Использование темы XML в AndroidManifest.xml
android:theme="@android:style/Theme.NoTitleBar"
Ответ 9
В вашем классе 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
}
}
Ответ 10
olivierg answer работал у меня, и это лучшее решение, если создать настраиваемый класс Dialog - это маршрут, который вы хотите использовать. Однако меня беспокоило, что я не могу использовать класс AlertDialog. Я хотел иметь возможность использовать стиль AlertDialog по умолчанию. Создание пользовательского диалогового класса не будет иметь этот стиль.
Итак, я нашел решение (хак), которое будет работать без создания пользовательского класса, вы можете использовать существующие сборщики.
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 как 3-й параметр (показать), чтобы он не вызывал show() в диалоговом окне. После этого диалог DialogFragment обработает это.
Пример:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getContext())
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, false);
return dialog;
}
По мере того, как я тестирую это, я обязательно буду обновляться с любыми дополнительными настройками.
Ответ 11
Я не знаю, является ли этот вопрос актуальным, но в моем случае, когда я переключился с Dialog на DialogFragment,
requestWindowFeature(Window.FEATURE_NO_TITLE);
не вариант, но я мог бы использовать
setStyle(STYLE_NO_TITLE, 0);
вместо этого с тем же результатом.
Ответ 12
Задайте заголовок пустой строкой с помощью построителя.
Builder builder = new AlertDialog.Builder(context);
builder.setTitle("");
...
builder.show();
Ответ 13
установите для атрибута "тяжесть" весь диалог "центр". Затем вам необходимо переопределить этот параметр ко всем дочерним компонентам в диалоговом окне, в котором вы не хотите центрировать.
Ответ 14
dialog=new Dialog(YourActivity.this, 1); // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);
Ответ 15
в XML используется тема
android:theme="@android:style/Theme.NoTitleBar"
Ответ 16
Если мы просто используем диалог без setTitle()
, то это будет работать при удалении пространства заголовка?
mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();
Ответ 17
Думаю, вы можете просто использовать это сейчас:
AlertDialog dialog = new AlertDialog.Builder(this)
.setView(view)
.setTitle("")
.create()
Ответ 18
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
"Loading. Please wait...", true);
создает диалог меньше заголовка
Ответ 19
Вы можете сделать это, не используя AlertDialog
, определяя новый класс, который простирается от Dialog
Class следующим образом:
public class myDialog extends Dialog {
public myDialog(Context context) {
super(context);
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
}
Ответ 20
При использовании AlertDialog, не используя setTitle()
, заголовок исчезает
Ответ 21
После кучи взлома я получил это для работы:
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);
Ответ 22
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();
}
Ответ 23
Здесь вы можете сделать с AlertBuilder
, чтобы исчезнуть название:
TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);
Ответ 24
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);