AlertDialog с настраиваемым представлением: изменение размера для переноса содержимого представления

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

у меня естьDialogFragment который возвращает базовыйAlertDialog с обычаемView установить с помощьюAlertDialog.Builder.setView(), Если этоView имеет конкретное требование к размеру, как я могу получитьDialog правильно изменить размер себя, чтобы отобразить весь контент в пользовательскомView?

Это пример кода, который я использовал:

package com.test.test;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends Activity {

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

        // Use a button for launching
        Button b = new Button(this);
        b.setText("Launch");
        b.setOnClickListener(new OnClickListener() {    
            @Override
            public void onClick(View v) {
                // Launch the dialog
                myDialog d = new myDialog();
                d.show(getFragmentManager(), null);
            }
        });

        setContentView(b);
    }

    public static class myDialog extends DialogFragment {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {           
            // Create the dialog
            AlertDialog.Builder db = new AlertDialog.Builder(getActivity());
            db.setTitle("Test Alert Dialog:");
            db.setView(new myView(getActivity()));

            return db.create();
        }

        protected class myView extends View {
            Paint p = null;

            public myView(Context ct) {
                super(ct);

                // Setup paint for the drawing
                p = new Paint();
                p.setColor(Color.MAGENTA);
                p.setStyle(Style.STROKE);
                p.setStrokeWidth(10);
            }

            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                setMeasuredDimension(800, 300);
            }

            @Override
            protected void onDraw(Canvas canvas) {
                // Draw a rectangle showing the bounds of the view
                canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), p);
            }
        }
    }
}

A Button создан, который открываетDialogFragment по щелчку. ОбычайView (myView) должен иметь ширину 800 и высоту 300, что правильно установлено в переопределенииonMeasure(), ЭтотView, рисует свои измеренные границы в пурпурном цвете для целей отладки.

Ширина 800 шире, чем по умолчаниюDialog размер на моем устройстве, но обрезается, а не растягивается правильно.

Я просмотрел следующие решения:

DialogFragment.getDialog возвращает нольКак контролировать ширину и высоту диалогового окна Alert по умолчанию в Android?Размер диалога оповещения или настраиваемого оповещения

Я вывел следующие два подхода к кодированию:

ПолучитьWindowManager.LayoutParams изDialog и переопределить их, используяmyDialog.getDialog().getWindow().get/setAttributes()С помощьюsetLayout(w, h) метод черезmyDialog.getDialog().getWindow().setLayout()

Я пробовал их везде, где только можно придуматьonStart(), вonShowListener, послеDialog создается и показывается и т. д.) и может обычно заставить оба метода работать правильно, еслиLayoutParams поставляютсяконкретное значение, Но всякий раз, когдаWRAP_CONTENT поставляется, ничего не происходит.

Какие-либо предложения?

РЕДАКТИРОВАТЬ:

Скриншот ситуации:

Снимок экрана с определенным значением (здесь вводится примечание 900, 850 не покрывает всю ширину просмотра, что имеет смысл, если настраивается все окно. Так что это обеспечивает - если нужно другое - причину, по которойWRAP_CONTENT обязательно / фиксированные значения не подходят):

Ответы на вопрос(8)

Ваш ответ на вопрос