AlertDialog z widokiem niestandardowym: Zmień rozmiar, aby zawinąć zawartość widoku
Mam ten problem w aplikacji, którą buduję. Proszę zignorować wszystkie niedociągnięcia w projektowaniu i brak najlepszych rozwiązań, aby pokazać przykład tego, czego nie mogę rozwiązać.
mamDialogFragment
który zwraca podstawowyAlertDialog
ze zwyczajemView
ustawić za pomocąAlertDialog.Builder.setView()
. Jeśli toView
ma specyficzne wymagania dotyczące rozmiaru, jak uzyskaćDialog
aby poprawnie zmienić rozmiar, aby wyświetlić całą zawartość niestandardowąView
?
Oto przykładowy kod, którego używam:
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
jest tworzony, co otwieraDialogFragment
na kliknięcie. ZwyczajView
(myView
) musi mieć szerokość 800 i wysokość 300, która jest poprawnie ustawiona w nadpisaniuonMeasure()
. ToView
, rysuje zmierzone granice w kolorze magenta do celów debugowania.
Szerokość 800 jest szersza niż domyślnaDialog
rozmiar na moim urządzeniu, ale jest przycinany, a nie rozciągany poprawnie.
Przejrzałem następujące rozwiązania:
DialogFragment.getDialog zwraca wartość nullJak kontrolować szerokość i wysokość domyślnego okna Alert w systemie Android?Rozmiar okna dialogowego alarmu lub niestandardowego okna alertuWyprowadziłem następujące dwa podejścia do kodowania:
ZdobądźWindowManager.LayoutParams
zDialog
i zastąp jemyDialog.getDialog().getWindow().get/setAttributes()
UżywającsetLayout(w, h)
metoda domyDialog.getDialog().getWindow().setLayout()
Próbowałem ich wszędzie, o czym myślę (nadrzędnyonStart()
, wonShowListener
, poDialog
jest tworzony i pokazywany itp.) i może ogólnie uzyskać poprawne działanie obu metod, jeśliLayoutParams
są dostarczane aokreślona wartość. Ale zawszeWRAP_CONTENT
jest dostarczane, nic się nie dzieje.
Jakieś sugestie?
EDYTOWAĆ:
Zrzut ekranu sytuacji:
Zrzut ekranu o określonej wartości (tutaj wpisana jest notatka 900, 850 nie obejmuje całej szerokości Widoku, co ma sens, biorąc pod uwagę, że całe okno jest modyfikowane. To zapewnia - jeśli inny był potrzebny - powódWRAP_CONTENT
jest niezbędne / stałe wartości nie są odpowiednie):