这个问题实际上出现在更复杂的情况下,涉及方向变化和纵向和横向的不同布局,但在它的最小版本中,问题是这样的:
我们想在“正常”和“全屏”布局之间来回切换,即。即:
要从普通屏幕切换到全屏,我们正在使用:
public static final int EXPAND_FLAGS = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
getWindow().getDecorView().setSystemUiVisibility(EXPAND_FLAGS);
为了切换回去,我们尝试了:
public static final int SHRINK_FLAGS = View.SYSTEM_UI_FLAG_VISIBLE;
getWindow().getDecorView().setSystemUiVisibility(SHRINK_FLAGS);
所以,从这里
我们首先“扩展”到这个:
但是“缩小”回去是行不通的:
因此,尽管 Activity 只允许在系统 UI 内部绘制,但它仍然“认为”应该为系统 UI 留出空间。
所以我的问题是:SHRINK_FLAGS 应该在我上面的代码中是什么,或者我应该做什么完全不同的事情?
我们正在使用带有 Theme.AppCompat.Light.DarkActionBar 主题的 AppCompatActivity。
最佳答案
您的布局的根似乎有 android:fitsSystemWindows="true"。由于某些我不知道的原因,fitsSystemWindows 在更改系统 UI 标志时不能正常工作。幸运的是,这个问题有一个解决方法。
首先,无条件地设置扩展系统 UI 标志:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
);
然后从布局的所有祖先 View 中删除 android:fitsSystemWindows="true"。
之后创建一个布局,该布局将处理系统插入更改并根据其属性值添加或删除填充。这是最复杂的部分。您必须根据平台版本以不同方式处理系统插入。对于低于 20 的版本(Kitkat Watch),您必须覆盖 View.fitSystemWindows()方法:
@Override
protected boolean fitSystemWindows(final Rect insets) {
if (mFit) {
setPadding(insets.left, insets.top, insets.right, insets.bottom);
// Do not propagate the system insets further.
return true;
} else {
setPadding(0, 0, 0, 0);
// Do not consume the insets and allow other views handle them.
return false;
}
}
对于大于或等于 20 的平台版本,您需要覆盖 View.onApplyWindowInsets()方法和前面方法相同的处理:
@Override
public WindowInsets onApplyWindowInsets(final WindowInsets insets) {
if (mFit) {
setPadding(
insets.getSystemWindowInsetLeft(),
insets.getSystemWindowInsetTop(),
insets.getSystemWindowInsetRight(),
insets.getSystemWindowInsetBottom()
);
return insets.consumeSystemWindowInsets();
} else {
setPadding(0, 0, 0, 0);
return insets;
}
}
最后为 mFit 字段创建一个 setter,它将通知系统它必须再次应用 insets:
mFit = fit;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
requestApplyInsets();
} else {
requestFitSystemWindows();
}
现在您可以调用 setFit(false) 使您的 View 布局在系统 UI 后面,并调用 setFit(true) 使布局适合系统窗口。
您可以获得此布局的源代码here .
关于android - 如何从 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32394135/
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道rubyonrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我在下面定义了api端点:paramsdorequires:ids,type:Array,desc:'Arrayofgroupids'end我无法从Swagger生成的UI传递数组。如果我输入[1,2,3,4]或ids%5b%5d=1&ids%5b%5d=2&ids%5b%5d=3然后两者都无效.如果我使用数组调用spec中的api,它就可以工作。我的客户想尝试Swagger的整个api,所以我想要一个适用于SwaggerUI的解决方案。 最佳答案 我对所有情况的解决方案:paramsdorequires:ids,type:Arra
我想在Rails中使用插件系统创建一个应用程序。潜在用户应该能够上传(或更好地从存储库安装)一个插件并安装它,使我的应用程序能够做更多的事情。这应该在没有FTP/SSH/对服务器的任何低级别访问的情况下完成。关于如何在Rails3中完成它,是否有任何好的gems或教程? 最佳答案 你看过http://edgeguides.rubyonrails.org/plugins.html了吗??它似乎不是100%兼容Rails3,但它可以帮助您入门。我看过的大多数插件文章都涉及Rails2。 关于
这个问题已经被问过几次了,但我尝试了提供的解决方案,但仍然没有帮助,所以我提出了一个新问题。gem文件gem'jquery-ui-rails'按照建议,我将gem放在:assets组之外Application.css~*=require_self*=requirejquery.ui*=requirebootstrap-datepicker*=requirejquery.timepicker*=require_tree.*/RailsAssetPipeline根据列出的顺序加载Assets。在这里,我把它排在列表的第2位。Application.css.scss*=require_sel
我有一个Rails应用,使用Rails5.1.6和ruby2.3.5p376我的Gemfile中有这两个gemgem'jquery-rails','~>4.3.3'gem'jquery-ui-rails','~>6.0.1'在show.html.erb中我有以下内容:$(function(){$("#datepicker").datepicker();});Date:在application.js中//=requirejquery-ui//=requirejquery//=requirerails-ujs//=requireturbolinks//=require_tree.在appl
Handler在UI线程与子线程中的使用一、Handler基本概念Handler:其作用是在新启动的线程中发送消息,在主线程中获取和处理消息。Message:Handler接收和处理的消息对象。MessageQueue:消息队列,采用先进先出的方式来管理Message。由Looper对象进行管理,在程序创建Looper对象时,会在它的构造方法中创建MessageQueue对象,两者是相互依存的。Looper:每个线程只能拥有一个Looper对象。它在loop()方法会不断在MessageQueue中读取Message消息,分给对应的Handler来进行处理。二、Handler使用步骤在主线程中
亲测可用。Anerroroccurredwhileresolvingpackages:Projecthasinvaliddependencies: com.unity.xxx:No'git'executablewasfound.PleaseinstallGitonyour systemthenrestartUnityandUnityHub在我们使用PackageManager时,Unity允许我们使用Git上的package(点击加号,选择addpackagefromgitURL,或者是直接在Asset/Packages/manifest.json中添加包名)。但是这种操作需要我们事先装好g
我有一个Rails应用程序,其中有一个功能可以发送很多电子邮件。我想以异步方式的方式进行,并且我认为deliver_later方法可以做到这一点。目前,从用户单击submit到提交表单,我有一些延迟-这会导致糟糕的用户体验(这是一个非常简单的表单)。我的实现如下所示:defcreaterespond_todo|format|if@competition.save[...]send_notification_to_team_membersendenddefsend_notification_to_team_members@team.members.eachdo|member|unless