Я пытаюсь реализовать FragmentDialog
с фиксированным соотношением сторон. Он должен быть таким же высоким, как высота экрана (минус некоторое заполнение), а ширина должна быть dialogWidth=dialogHeight*ar
. Поскольку FragmentDialog
не предоставляет метод onMeasure.I переопределяет этот метод в классе содержимого окна редактора:FragmentDialog с фиксированным соотношением сторон
public class PuzzleSelectorView extends FrameLayout {
public PuzzleSelectorView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
//Log.d("selector",heightSize+"");
int dy=((ImageView)this.findViewById(R.id.selector_start_btn)).getHeight();
int desiredWidth=(int) ((heightSize-dy) *ImagesItemView.IMAGE_ASPECT_RATIO);
widthMeasureSpec=MeasureSpec.makeMeasureSpec(desiredWidth,MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
this.setMeasuredDimension(desiredWidth, heightSize);
//this.setMeasuredDimension(320,240);
}
}
Фрагмент класс:
public class PuzzleSelectorFragment extends DialogFragment {
private Decryptor loader;
public void show(FragmentManager manager,String tag, String imgId) {
super.show(manager,tag);
//some unrelated code
}
@Override
public void onDismiss(final DialogInterface dialog) {
super.onDismiss(dialog);
Log.d("dialog","closed");
}
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_image_selector,null);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
Dialog dialog = getDialog();
if (dialog != null)
{
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
dialog.getWindow().setLayout(width, height);
dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
@Override
public void onStart()
{
super.onStart();
}
}
Содержание раскладка:
<?xml version="1.0" encoding="utf-8"?>
<com.rhyboo.net.listtest.layouts.PuzzleSelectorView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/selector_img_container"
android:layout_marginBottom="48dp"
android:scaleType="fitXY" />
<ImageView
android:layout_width="match_parent"
android:layout_height="48dp"
app:srcCompat="@color/colorAccent"
android:id="@+id/selector_start_btn"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:layout_gravity="bottom" />
<com.rhyboo.net.listtest.layouts.CustomTextView
app:customFont="Lato-Regular.ttf"
android:text="@string/start_puzzle_btn"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:id="@+id/textView"
android:layout_gravity="bottom|center_horizontal"
android:gravity="center_vertical"
android:textSize="18sp"
android:textColor="@color/background" />
<ProgressBar
style="?android:attr/progressBarStyleSmall"
android:layout_width="40dp"
android:layout_height="40dp"
android:id="@+id/selector_preloader"
android:layout_gravity="center_vertical|center_horizontal" />
Чтобы показать это я:
PuzzleSelectorFragment selector=new PuzzleSelectorFragment();
selector.show(MainActivity.this.getSupportFragmentManager(),"selector",id);
Он отлично работает на реальном устройстве (Android 5.1.1):
Но когда я бегу на эмуляторе (7,1 Android) I получил поврежденный макет:
Мой вопрос: я двигаюсь в правильном направлении, задав размер фрагмента внутри класса контента onMeasure? Если нет, где его установить?