2017-01-09 5 views
0

Я пытаюсь реализовать 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): real device

Но когда я бегу на эмуляторе (7,1 Android) I получил поврежденный макет: enter image description here

Мой вопрос: я двигаюсь в правильном направлении, задав размер фрагмента внутри класса контента onMeasure? Если нет, где его установить?

ответ

0

По какой-то причине, если я установить размер просматривать контент с setMeasuredDimension, FragmentDialog в андроида 7 не макет правильно ImageViews с BitmapDrawable внутри it.Solved переопределив OnLayout и вызова метода layout Чайлдс с требуемыми размерами.

Смежные вопросы