Пользовательский диалог, заполняющий высоту экрана

Я пытаюсь создать собственный диалог, и он работает просто отлично, но диалог заполняет всю высоту экрана. Я провел несколько неудачных исследований в интернете, но у меня не так много времени для этой задачи, если кто-нибудь знает, почему это происходит, я очень ценю это.

вот onCreateDialog():

public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder= new AlertDialog.Builder(getContext());
    LayoutInflater inflater= (LayoutInflater) builder.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.dialog__warning, mContainer, false);
    txtWarning = (TextView)view.findViewById(R.id.txtWarning);
    if(messageWarning.length()>0)
    {
        txtWarning.setText(messageWarning);
    }
    btnOkDialog = (Button) view.findViewById(R.id.btnOkDialog);
    btnOkDialog.setOnClickListener(MyListener);
    btnCancelDialog = (Button) view.findViewById(R.id.btnCancelDialog);
    btnCancelDialog.setOnClickListener(MyListener);
    builder.setView(view);
    return builder.create();
}

и XML файла dialog_warning:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="300dp"
android:layout_height="300dp"
android:background="#b1b0b0"
tools:context="ipat.johanbayona.gca.ipat.NewEvidence.Dialog_Warning">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:textSize="25sp"
    android:id="@+id/txtWarning"
    android:text="Mensaje error" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="OK"
    android:id="@+id/btnOkDialog"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_marginBottom="10dp"
    />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Cancel"
    android:id="@+id/btnCancelDialog"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_marginBottom="10dp"
    />
</RelativeLayout>

2 ответа

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="300dp"
android:layout_height="300dp"
android:background="#b1b0b0"
tools:context="ipat.johanbayona.gca.ipat.NewEvidence.Dialog_Warning">

Измените "layout_height" на wrap_content. Вы установили высоту и ширину, это может быть проблемой в зависимости от размера вашего экрана.

Попробуйте создать собственную тему для диалога, что-то вроде этого

<style name="AppDialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
</style>

и установите эту тему, передавая супер-конструктор диалога с R.style.AppDialog

UPD. это не конструктор строителя. Вы должны создать свой собственный класс, который расширяет AlertDialog, переопределяет его onCreate и супер конструктор, и ваш класс должен быть примерно таким

public class YourDialog extends Dialog {

    public YourDialog(@NonNull Context context) {
        super(context, R.style.AppDialog);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.dialog__warning);

        txtWarning = (TextView) findViewById(R.id.txtWarning);
        if(messageWarning.length()>0)
        {
            txtWarning.setText(messageWarning);
        }
        btnOkDialog = (Button) findViewById(R.id.btnOkDialog);
        btnOkDialog.setOnClickListener(MyListener);
        btnCancelDialog = (Button) findViewById(R.id.btnCancelDialog);
        btnCancelDialog.setOnClickListener(MyListener);
    }
}

переопределение основного конструктора и передача R.style.AppDialog должны сделать свое дело. все, что вам нужно, это позвонить туда, где вы хотите, чтобы показать диалог new YourDialog(context).show();

обратите внимание, что вам не нужно вручную вызывать инфлятор, чтобы передать ваше собственное представление контента, просто вызов setContentView с помощью resId автоматически раздувает представление под ним.

Другие вопросы по тегам