2016-12-10 11 views
0

Я прибегая к помощи в течение нескольких часов и пытался бесчисленные вещи, но я просто не могу получить эту работу ...Как сделать полноэкранный режим DialogFragment без перекрытия строки состояния/навигационной панели и цвета строки состояния мантенов?

Это MyFragment.java:

public class MyFragment extends DialogFragment { 

    public MyFragment() { 
     // Required empty public constructor 
    } 

    public static MyFragment newInstance() { 
     MyFragment newFragment = new LoginDialogFragment(); 
     newFragment.setCancelable(false); 
     return newFragment; 
    } 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new Dialog(getActivity(), R.style.MyAppTheme_Dialog); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_my, container, false); 
     ButterKnife.bind(this, view); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     Window window = getDialog().getWindow(); 

     if (window != null) { 
      window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); 
      window.setWindowAnimations(R.style.MyAppTheme_Dialog); 
     } 
    } 

} 

И это styles.xml:

<style name="MyAppTheme" parent="PreferenceFixTheme.Light.NoActionBar"> 
    <item name="android:windowBackground">@color/background</item> 
    <item name="android:colorBackground">@color/background</item> 
    <item name="colorPrimary">@color/primary</item> 
    <item name="colorPrimaryDark">@color/primary_dark</item> 
    <item name="colorAccent">@color/accent</item> 
    <item name="preferenceCategory_marginBottom">0dp</item> 
</style> 

<style name="MyAppTheme.Dialog"> 
    <item name="android:backgroundDimEnabled">false</item> 
    <item name="android:windowBackground">@null</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowEnterAnimation">@anim/slide_up</item> 
    <item name="android:windowExitAnimation">@anim/slide_down</item> 
    <item name="android:windowFrame">@null</item> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item> 
</style> 

Это почти работает так, как я ожидаю ... Единственная проблема заключается в том, что вызов window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); для заполнения всего экрана (минус полосы состояния/навигации) изменяет цвет строки состояния на черный. Когда я закрываю диалог, он возвращается обратно к colorPrimaryDark.

Если я удалю эту строку window.setLayout(...), строка состояния сохранит colorPrimaryDark, но размер диалогового окна будет по умолчанию (маленький квадрат в середине экрана).

В том же месте, я называю window.setLayout(...), я попытался положить следующий код:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
    getWindow().setStatusBarColor(ContextCompat.getColor(getActivity, R.color.primary_dark)); 
} 

Это устанавливает статус бар цвет для colorPrimaryDark но перекрывается как статус и панель навигации.

Я просто не могу получить полноэкранный режим без перекрытия состояния и навигационных панелей и сохранить colorPrimaryDark в строке состояния.

Несколько вопросов, которые я нашел с той же проблемой, но я не мог заставить эти предложения работать. Ни у обслуживаемого ответ:

+0

Должен ли он быть диалоговым? Будет ли работа работать? – Karakuri

+0

вы пробовали с переопределенным диалоговымфрагментом. У меня есть код. я не знаю, что удовлетворит ваши потребности или нет. любым способом я отправлю код. попробуй. – Noorul

+1

Почему вы пытаетесь заставить диалог не быть диалогом? Кажется, вы используете неправильную абстракцию. – ianhanniballake

ответ

1

проверить это заказной диалог фрагмент, попробовать который будет удовлетворять ваши потребности. и дайте мне знать.

import android.content.pm.ActivityInfo; 
import android.content.res.Configuration; 
import android.graphics.Point; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.util.TypedValue; 
import android.view.Display; 

/** 
    * Created by Noorul on 02-07-16. 
*/ 

public class _DialogFragment extends DialogFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // preventScreenRotation(); 
    } 

    @Override 
    public void onDestroy() { 
    // releaseScreenRotation(); 
    super.onDestroy(); 
} 

@SuppressWarnings("deprecation") 
@Override 
public void onStart() { 
    super.onStart(); 

    // change dialog width 
    if (getDialog() != null) { 

     int fullWidth = getDialog().getWindow().getAttributes().width; 
     int fullHeight = getDialog().getWindow().getAttributes().height; 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { 
      Display display = getActivity().getWindowManager().getDefaultDisplay(); 
      Point size = new Point(); 
      display.getSize(size); 

      fullWidth = size.x; 
      fullHeight = size.y; 
     } else { 
      Display display = getActivity().getWindowManager().getDefaultDisplay(); 
      fullWidth = display.getWidth(); 
      fullHeight = display.getHeight(); 
     } 

     final int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 0, getResources() 
       .getDisplayMetrics()); 

     int w = fullWidth - padding; 
     int h = fullHeight - (padding * 2); 

     getDialog().getWindow().setLayout(w, h); 
    } 
} 


private void preventScreenRotation() { 
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
       getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } else { 
     getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
} 
    } 

    private void releaseScreenRotation() { 
     getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
} 
} 

изменить размер диалогового окна зависит от ваших потребностей.

+0

Это почти сработало ... Я забыл упомянуть одну деталь по моему вопросу. У меня есть анимация слайдов (снизу вверх) на этом фрагменте, и этот код будет иметь размер точно так, как я ожидаю, и строка состояния сохранит его цвет. Единственная проблема заключается в том, что фрагмент будет сверху верхней навигационной панели, а затем сдвинется вверх ... :( –

+0

вы можете поделиться мне скриншотом? – Noorul

+0

Я не могу сказать, что это еще не выпущено, но это очень аналогично этому: https://i.stack.imgur.com/cppoj.png - Посмотрите, как бит «write comment» перекрывает кнопки панели навигации? Это то, что происходит во время анимации слайдов. Когда все будет готово, он будет выглядеть (но с правильным цветом строки состояния): https://i.stack.imgur.com/HiSv9.png - Это то, что я хочу. –

0

Чтобы создать полноэкранное диалоговое окно в соответствии с Руководством по дизайну материалов. Поместите этот код в DialogFragment:

@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Dialog dialog = super.onCreateDialog(savedInstanceState); 
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     return dialog; 
    } 

Позвоните этот диалог:

getSupportFragmentManager().beginTransaction().add(android.R.id.content, FullScreenDialog.newInstance()).addToBackStack(null).commit(); 

Установите верхний предел для 24dp в базовой компоновке. Чтобы диалоговое окно не перекрывало строку состояния.