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
обязательно / фиксированные значения не подходят):