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