我对新AndroidKitKat(4.4)中半透明的actionbar/navbar和WindowsofInputMode=“adjustResize”
有问题。
通常情况下,将InputMode更改为adjustResize
,当显示键盘时,应用程序应该自行调整大小,但在这里它不会!如果我删除了透明效果的线条,则调整大小是有效的。
因此,如果键盘可见,我的ListView
在它下面,我无法访问最后几个项目(只能手动隐藏键盘)。
AndroidManifest。xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XYZ"
android:versionCode="23"
android:versionName="0.1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.XYZStyle" >
<activity
android:name="XYZ"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
价值观-v19/styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.XYZStyle" parent="@style/Theme.AppCompat.Light">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
碎片xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView_contacts"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:divider="@null"
android:dividerHeight="0dp"
android:drawSelectorOnTop="true"
android:fastScrollAlwaysVisible="true"
android:fastScrollEnabled="true"
android:paddingBottom="@dimen/navigationbar__height" >
</ListView>
</RelativeLayout>
有什么办法解决这个问题吗?
@kcoppock回答真的很有帮助,但是fitSystemWindows在API级别20中被弃用
因此,由于API 20(KITKAT_WATCH),您应该覆盖onApplyWindowInset
@Override
public final WindowInsets onApplyWindowInsets(WindowInsets insets) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,
insets.getSystemWindowInsetBottom()));
} else {
return insets;
}
}
这里有一个相关的bug报告。我已经找到了一种解决方法,通过有限的测试,它似乎可以在不产生任何影响的情况下达到目的。使用下面的逻辑添加根视图组的自定义实现(我几乎总是使用FrameLayout
,所以这就是我测试的内容)。然后,使用此自定义布局代替根布局,并确保设置了android:fitsystemwindows=“true”
。然后,如果需要,您可以在布局后随时调用getInsets()
(例如,添加一个OnPreDrawListener
)来调整布局的其余部分,以考虑系统插入。
import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import org.jetbrains.annotations.NotNull;
/**
* @author Kevin
* Date Created: 3/7/14
*
* https://code.google.com/p/android/issues/detail?id=63777
*
* When using a translucent status bar on API 19+, the window will not
* resize to make room for input methods (i.e.
* {@link android.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_RESIZE} and
* {@link android.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_PAN} are
* ignored).
*
* To work around this; override {@link #fitSystemWindows(android.graphics.Rect)},
* capture and override the system insets, and then call through to FrameLayout's
* implementation.
*
* For reasons yet unknown, modifying the bottom inset causes this workaround to
* fail. Modifying the top, left, and right insets works as expected.
*/
public final class CustomInsetsFrameLayout extends FrameLayout {
private int[] mInsets = new int[4];
public CustomInsetsFrameLayout(Context context) {
super(context);
}
public CustomInsetsFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public final int[] getInsets() {
return mInsets;
}
@Override
protected final boolean fitSystemWindows(@NotNull Rect insets) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// Intentionally do not modify the bottom inset. For some reason,
// if the bottom inset is modified, window resizing stops working.
// TODO: Figure out why.
mInsets[0] = insets.left;
mInsets[1] = insets.top;
mInsets[2] = insets.right;
insets.left = 0;
insets.top = 0;
insets.right = 0;
}
return super.fitSystemWindows(insets);
}
}
由于不推荐使用fitSystemWindow
s,请参考下面的答案来完成解决方案。
您缺少以下属性:
android:fitsSystemWindows="true"
在片段的根RelativeLayout
中。xml布局。
更新:
去年,克里斯·班恩(Chris Bane)做了一次有趣的演讲,详细解释了这是如何工作的:
https://www.youtube.com/watch?v=_mGDMVRO3iE
在iOS 7上,将UISearchBar设置为半透明并不会使搜索栏半透明。有什么我不明白的吗?我正在将它添加到UIViewController,它是UINavigationController的一部分。有一个与顶部布局指南对齐的UITableView。导航栏很好,半透明,但由于某些原因,搜索栏是纯色的。
我正在尝试为一个学校项目制作我的第一个应用程序。我有时会通过跟随其他人的问题和答案来获得半透明的状态栏,但是导航只是变成灰色,但是没有活动的内容,但是抽屉菜单在状态栏和导航栏下面绘制,我如何使活动也在状态栏和导航栏下面绘制? 在此处输入图像描述 在此处输入图像描述 在onCreate下,图2的代码为: WindowManager。布局参数。旗帜(半透明导航); 我试过使用android:fitsy
我有一个覆盖整个屏幕的片段A和另一个位于50dp屏幕底部的片段B。片段B与片段A的底部部分重叠。我想使片段B半透明,以便看到片段A的重叠部分。 我试着使用主题。半透明,使用了framelayouts,使用了setAlpha()方法,但没有得到想要的结果。就像我们在android中有一个半透明的actionbar一样,我想让我的片段B半透明。 我试着参考这些链接...链接1:使背景半透明 链接2:h
我想创建一个包含透明和半透明部分的图像,这样如果我给,比如说颜色x作为背景,透明部分将显示x颜色,半透明部分将显示颜色x的渐变阴影。 我需要这样一个图像在模板中使用,将由客户谁将有不同的颜色主题使用。 编辑:问题是如何创建既透明 编辑:我让我的问题更清楚了。在附加的图像中,有一个透明区域。想法是在图像中有一个透明区域和一个半透明区域(指向指针的区域,目前这不是半透明的),这样如果我给红色作为bg颜
我知道我可以用以下方式制作一个带有透明背景的png图(这对我很有用): 但是我怎样才能使背景半透明,带有分数阿尔法数?我在另一个博客上读到,人们可以这样做: 但这对我不起作用,产生了一个没有透明度的情节,给了我这个不透明的png(在ppt中得到证实)。 针对这些评论, 给我MacOSX,我就上了 Python 3.9。4(默认值,4月5日2021,01:49 30)[CLAN120.0(CLAN-
我使用以下布局(main_activity.xml) 具有以下样式-v21 但我仍然无法归档一个透明的状态栏 看起来像这样 但我想要这样的东西(新谷歌报摊App) 注意:我正在使用