Java 如何使DialogFragment全屏显示而不重叠状态栏/导航栏和mantain状态栏颜色?
我已经在谷歌上搜索了几个小时,尝试了无数的东西,但我就是无法让它工作 这是Java 如何使DialogFragment全屏显示而不重叠状态栏/导航栏和mantain状态栏颜色?,java,android,android-dialogfragment,android-statusbar,Java,Android,Android Dialogfragment,Android Statusbar,我已经在谷歌上搜索了几个小时,尝试了无数的东西,但我就是无法让它工作 这是MyFragment.java: public class MyFragment extends DialogFragment { public MyFragment() { // Required empty public constructor } public static MyFragment newInstance() { MyFragment newF
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>
这将状态栏颜色设置为colorPrimaryDark
,但它与状态栏和导航栏重叠
如果不重叠状态栏和导航栏并在状态栏上保留colorPrimaryDark
,我就无法全屏显示
我发现了一些问题与同样的问题,但我无法得到的建议工作。两人都没有公认的答案:
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);
}
}
根据您的需要更改对话框的大小。检查此自定义对话框片段,尝试满足您的需要。让我知道
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);
}
}
根据需要更改对话框的大小。根据材料设计指南创建全屏对话框。 将此代码放入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。使对话框不与状态栏重叠。根据材料设计指南创建全屏对话框。 将此代码放入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。这样对话框就不会与状态栏重叠。它必须是DialogFragment吗?活动是否有效?您是否尝试过重写dialogfragment。我有密码。我不知道哪个能满足你的需要。不管怎样,我都会发布代码。试试看。你为什么要强迫一个对话不是对话?您似乎使用了错误的抽象。@Karakuri它必须是一个
对话框片段
,因为我需要setCancelable(false)
来禁止在打开此特定片段时按下后退按钮。要在一个普通片段上实现这一点,需要在活动中处理后退按钮的按下,我不喜欢可能的解决方案。@ianhanniballake从我们的UX/UI团队的角度来看,这是一个对话框,它只填充整个屏幕(这是他们的模式对话框方法)。这不是应该在屏幕上长期存在的东西。打开此文件,快速执行片段的任务并关闭它,而不影响当前的活动/片段生命周期。它必须是DialogFragment吗?活动是否有效?您是否尝试过重写dialogfragment。我有密码。我不知道哪个能满足你的需要。不管怎样,我都会发布代码。试试看。你为什么要强迫一个对话不是对话?您似乎使用了错误的抽象。@Karakuri它必须是一个对话框片段
,因为我需要setCancelable(false)
来禁止在打开此特定片段时按下后退按钮。要在一个普通片段上实现这一点,需要在活动中处理后退按钮的按下,我不喜欢可能的解决方案。@ianhanniballake从我们的UX/UI团队的角度来看,这是一个对话框,它只填充整个屏幕(这是他们的模式对话框方法)。这不是应该在屏幕上长期存在的东西。你打开这个,快速完成片段的任务并关闭它,而不影响当前的活动/片段生命周期。这几乎奏效了。。。关于我的问题,我忘了提一个细节。我在这个片段上有一个向上滑动的动画(从下到上),这个代码片段的大小将完全符合我的预期,状态栏将保持它的颜色。唯一的问题是,当向上滑动时,碎片将位于底部导航栏的顶部…:(你能和我分享一下屏幕截图吗?我看不出一个真实的屏幕截图。这个截图还没有发布,但它与这个截图非常相似:-看看“写评论”部分是如何与导航栏按钮重叠的吗?这就是幻灯片动画中发生的情况。当它完成时,它看起来是这样的(但状态栏颜色正确):-这就是我想要的。你能发布对话框的XML代码吗?尝试从顶部添加填充。这会有帮助。我不明白顶部填充如何帮助动画与底部导航栏重叠…这几乎奏效了…我忘了在我的问题上提一个细节。我有一个幻灯片动画(从底部到顶部)在这个片段和这段代码上,片段的大小将完全符合我的预期,状态栏将保持其颜色。唯一的问题是,当向上滑动时,片段将位于底部导航栏的顶部…:(你能和我分享一下屏幕截图吗?我看不出一个真实的屏幕截图。这个截图还没有发布,但它与这个截图非常相似:-看看“写评论”部分是如何与导航栏按钮重叠的吗?这就是幻灯片动画中发生的情况。当它完成时,它看起来是这样的(但状态栏颜色正确):-这就是我想要的。你能发布对话框的XML代码吗?尝试从顶部添加填充。这会有帮助。我不明白顶部填充如何帮助动画与底部导航栏重叠。。。