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 WarnungsdialogsIch 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):