Подтвердить что ты не робот

AlertDialog: как удалить черные границы над и под ним

Этот вопрос задан раньше: Пользовательское название AlertDialog имеет черную рамку

Но на него не ответили удовлетворительно - и отсутствует какая-то информация.


Я пытаюсь создать пользовательский диалог в Android без заголовка и без кнопок внизу.

Однако в результате диалог имеет черные "границы" / "интервал" /что-то в верхней и нижней частях представления.

От Документация:

Диалог, созданный с базовым классом Dialog, должен иметь заголовок. если ты не вызывайте setTitle(), тогда пространство, используемое для заголовка, остается пустой, но все же видимый. Если вам вообще не нужен заголовок, тогда вы должен создать ваш пользовательский диалог, используя класс AlertDialog. Однако, потому что AlertDialog создается проще всего с помощью AlertDialog.Builder класса, у вас нет доступа к используемому методу setContentView (int) выше. Вместо этого вы должны использовать setView (View). Этот метод принимает вид объект, поэтому вам нужно раздуть макет root. Просмотреть объект из XML.

Итак, что я сделал:

Welcome.java

public class Welcome  extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.welcome);

        LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.welcomedialog, (ViewGroup)findViewById(R.id.layout_root));

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(layout);
        builder.create().show();
    }
}

welcomedialog.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/texturebg"
              android:id="@+id/layout_root"
              android:orientation="vertical"
              android:padding="40px">
    ...
</LinearLayout>

ПРИМЕЧАНИЕ.. Я пытался использовать FrameLayout в качестве корня ViewGroup вместо LinearLayout в соответствии с предложением, которое я нашел где-то, но это не помогло.

Результат

enter image description hereenter image description here


setBackgroundDrawable Suggestion

public class Welcome  extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.welcome);

        LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.welcomedialog, (ViewGroup)findViewById(R.id.layout_root));

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(layout);
        AlertDialog dialog = builder.create();

        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));

        dialog.show();
    }
}

Не работает для меня.

4b9b3361

Ответ 1

Если вы посмотрите на источник AlertDialog-класса, вы увидите, что большинство методов - это просто прокси-методы (фасад) вокруг private AlertController mAlert.

Глядя на источник атрибута AlertController, вы увидите 4 интересные переменные-члены:

private int mViewSpacingLeft;
private int mViewSpacingTop;
private int mViewSpacingRight;
private int mViewSpacingBottom;
private boolean mViewSpacingSpecified = false;

Настройка mViewSpacingSpecified на true приведет к удалению границ в верхней и нижней частях диалогового окна.

Это сделано правильно, изменив эту строку:

dialog.setView(layout);

в

dialog.setView(layout, 0, 0, 0, 0);

Ответ 2

dialog.setInverseBackgroundForced(true);

используйте приведенное выше в своем коде, чтобы удалить границу диалогового окна предупреждения.

Обратитесь к LINK для InverseBackgroundForced.

ОБНОВЛЕНО Попробуйте этот код::

public class Welcome  extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.welcome);

        AlertDialog.Builder builder = new AlertDialog.Builder(Welcome.this);
        LayoutInflater _inflater = LayoutInflater.from(Welcome.this);
        View view = _inflater.inflate(R.layout.welcomedialog,null);
        builder.setView(view);

        AlertDialog alert = builder.create();
        alert.show();
    }
}

Примечание:: Также попробуйте удалить андроид: padding = "40px" из welcomeialog.xml.

Ответ 3

В моем случае эта граница была вызвана темой родительской активности для AlertDialog. Чтобы полностью избавиться от границы, дайте ей другую тему (в данном случае, Holo):

AlertDialog.Builder builder = new AlertDialog.Builder(
                                new ContextThemeWrapper(this, android.R.style.Theme_Holo)
                              );

Это исправило это для меня. Надеюсь, это поможет!

Ответ 4

Просто, чтобы Стив ответил более ясно, это можно сделать легко. Например, в моем случае представление, которое я устанавливал в диалоговом окне, было WebView.

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    WebView webView = new WebView(getActivity());
    webView.loadUrl(" url to show ");


    OnClickListener clickListenerOk = new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            ...
        }
    };

    OnClickListener clickListenerCancel = new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            ...
        }
    };

    AlertDialog dialog = new AlertDialog.Builder(getActivity())

            .setPositiveButton("OK", clickListenerOk)

            .setNegativeButton("Cancel",clickListenerCancel)

            .create();

    dialog.setView(webView, 0, 0, 0, 0);

    return dialog;
}

Ответ 5

setBackgroundDrawable(new ColorDrawable(0));

Вызовите это в своем диалоговом окне.