可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
As you can see my "Got It" button is behind the navigation bar.Not able to fix it!!! I have tried
<item name="android:fitsSystemWindows">true</item>
As well as setting it in layout file.
my theme in value-21 is :
<style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:fitsSystemWindows">true</item>
</style>
Its the same case with all the screens throughout the application.
Please Help.
回答1:
Here is the solution.
Most of the layouts get solved by adding these properties in value-21 style.xml
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:fitsSystemWindows">true</item>
for others, I have calculated the hight of navigation bar and add margin to my view .
public static int getSoftButtonsBarSizePort(Activity activity) {
// getRealMetrics is only available with API 17 and +
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
int usableHeight = metrics.heightPixels;
activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
int realHeight = metrics.heightPixels;
if (realHeight > usableHeight)
return realHeight - usableHeight;
else
return 0;
}
return 0;
}
Note: By using the above solutions everything work but I was also using PopupWindow in my app.The layout of the PopupWindow get messed up in android L. Look for the issue and the solution here
回答2:
For nice user experience you should not need to block navigation keys area using android:windowTranslucentNavigation
rather here is the better solution, if you are using ResideMenu library then simply add this method in ResideMenu.java
@Override
protected boolean fitSystemWindows(Rect insets) {
int bottomPadding = insets.bottom;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Resources resources = getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
bottomPadding += resources.getDimensionPixelSize(resourceId);
}
}
this.setPadding(viewActivity.getPaddingLeft() + insets.left, viewActivity.getPaddingTop() + insets.top,
viewActivity.getPaddingRight() + insets.right, viewActivity.getPaddingBottom() + bottomPadding);
insets.left = insets.top = insets.right = insets.bottom = 0;
return true;
}
and if you are using SlidingMenu
library then change mod to SLIDING_CONTENT
by:
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
Hope it will save your time
回答3:
It is so simple,
just add this line to your parent layout xml:
android:fitsSystemWindows="true"
回答4:
Simply set this in your Activity's onCreate(), while setting up content view :
int mScreenWidth = getWindowManager().getDefaultDisplay().getWidth();
int mScreenHeight = getWindowManager().getDefaultDisplay().getHeight();
View view = getLayoutInflater().inflate(R.layout.activity_main, null);
setContentView(view, new ViewGroup.LayoutParams(mScreenWidth, mScreenHeight));
回答5:
Use this code in your onCreate method of your Activity
(If you have BaseActivity
you can do this there so all activities apply this):
ViewCompat.setOnApplyWindowInsetsListener(
findViewById(android.R.id.content), (v, insets) -> {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
params.bottomMargin = insets.getSystemWindowInsetBottom();
return insets.consumeSystemWindowInsets();
});
When a layout has this flag, it means that this layout is asking the system to be applied window insets. In our case that would mean, that FrameLayout desires to be applied a padding that is equal to status bar’s height.
回答6:
Setting softInputMode
of popupWindow
to SOFT_INPUT_ADJUST_RESIZE
resolves the issue.