AlertDialog mit benutzerdefinierter Ansicht: Ändern Sie die Größe, um den Inhalt der Ansicht zu umbrechen

Ich habe dieses Problem in einer Anwendung gehabt, die ich baue. Bitte ignorieren Sie alle Designmängel und das Fehlen von Best-Practice-Ansätzen. Dies ist nur ein Beispiel dafür, was ich nicht lösen kann.

ich habeDialogFragment das gibt eine grundlegendeAlertDialog mit einem BrauchView einstellen mitAlertDialog.Builder.setView(). Wenn dasView Wie bekomme ich das?Dialog Um die Größe der Benutzeroberfläche zu ändern, wird der gesamte Inhalt der Benutzeroberfläche angezeigtView?

Dies ist der Beispielcode, den ich verwendet habe:

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 erstellt wird, die die öffnetDialogFragment auf einen Klick. Der BrauchView (myView) muss eine Breite von 800 und eine Höhe von 300 haben, die bei einem Override von 1 richtig eingestellt istonMeasure(). DieseView, zeichnet die gemessenen Grenzen für Debugging-Zwecke in Magenta.

Die Breite 800 ist breiter als die StandardbreiteDialog Größe auf meinem Gerät, wird aber nicht richtig gedehnt, sondern abgeschnitten.

Ich habe folgende Lösungen durchgesehen:

DialogFragment.getDialog gibt null zurückWie steuere ich die Breite und Höhe des Standard-Warndialogs in Android?Größe des Warnungsdialogs oder des benutzerdefinierten Warnungsdialogs

Ich habe die folgenden zwei Codierungsansätze abgeleitet:

Bekommen dasWindowManager.LayoutParams desDialog und überschreiben sie mitmyDialog.getDialog().getWindow().get/setAttributes()Verwendung dersetLayout(w, h) Methode durchmyDialog.getDialog().getWindow().setLayout()

Ich habe sie überall ausprobiert (außer Kraft gesetzt)onStart(), in einemonShowListener, nach demDialog erstellt und angezeigt wird, etc) und kann im Allgemeinen beide Methoden zum korrekten Funktionieren bringen, wenn dieLayoutParams geliefert werden aspezifischer Wert. Aber wann immerWRAP_CONTENT geliefert wird, passiert nichts.

Irgendwelche Vorschläge?

BEARBEITEN:

Screenshot der Situation:

Screenshot eines bestimmten Wertes (Anmerkung 900 wird hier eingegeben, 850 deckt nicht die gesamte Breite der Ansicht ab. Dies ist sinnvoll, wenn das gesamte Fenster angepasst wird. Wenn also ein anderer Wert benötigt wurde, gibt dies den Grund dafür anWRAP_CONTENT ist unabdingbar / feste Werte sind nicht zutreffend):

Antworten auf die Frage(8)

Ihre Antwort auf die Frage