我细化了Android Studio的Navigation Drawer Activity项目模板,使用Toolbar、v7.app.ActionBarDrawerToggle和NavigationView代替NavigationDrawerFragment(和 layout/fragment_navigation_drawer.xml)。
它运行良好。然后,我更进一步。我的抽屉导航项目处于immersive-sticky(全屏)模式。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
View decorationView = getWindow().getDecorView();
decorationView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
...
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle(
this,
drawerLayout,
R.string.navigation_drawer_open, /* "open drawer" description for accessibility */
R.string.navigation_drawer_close /* "close drawer" description for accessibility */
) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
};
drawerLayout.setDrawerListener(drawerToggle);
navigationView = (NavigationView) findViewById(R.id.navigation_view);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
...
}
出现了一个问题。来自状态栏(顶部)和导航栏(底部)的 NavigationView 上的重叠阴影效果带保持不变。
我怎样才能摆脱它们?
我查看了 Android 的 v7.app.ActionBarDrawerToggle 或 NavigationView 的源代码,但没有成功。
感谢@lcw_gg 的建议,我已经完全摆脱了状态栏的阴影(而导航栏的阴影仍然存在)。即在layout xml中设置android:windowFullscreen属性true
但我想用 Java 代码来实现。我找到了一种方法,它可能等同于 xml 方式:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
通过这样做,您不再需要将这两个标志 - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 和 View.SYSTEM_UI_FLAG_FULLSCREEN - 设置到 装饰 View .
仍然,我找不到摆脱导航栏阴影的方法。我在等待解决方案。
最佳答案
我终于成功了。
解决方案是使用 FLAG_LAYOUT_NO_LIMITS 和 FLAG_FULLSCREEN 到 android.view.Window对象。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
这已经完美地摆脱了两个阴影。
lcw_gg 的评论对于操纵 android.view.Window 是非常有用的线索.特别感谢他。
不幸的是,当我将手机更新到 Android 11 (API-30) 时,问题又来了。上述解决方案不再有效。另一种解决方案是 @AllanVeloso's answer使用 app:insetForeground="@null"
而且我还得到了一个新的解决方案。 只需摆脱 SYSTEM_UI_FLAG_LAYOUT_STABLE 就可以了。这 SYSTEM_UI_FLAG_LAYOUT_STABLE 应该是阴影效果的根本原因。
对于我对 Google Developer 或 StackOverflow 的拙劣研究,该标志总是被解释为与 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 和/或 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 一起使用,但是没有确切的解释关于SYSTEM_UI_FLAG_LAYOUT_STABLE本身除了:
This means that the insets seen there will always represent the worst case that the application can expect as a continuous state.
所以我自动将它与其他两个一起使用。但这是这个问题的根源。只需单独删除 SYSTEM_UI_FLAG_LAYOUT_STABLE 即可解决此问题(即使在 Android 10 或更早版本上也是如此)。
如您所知,那些 View.SYSTEM_UI_FLAG_* 已从 Android 11 (API-30) 中弃用。
您将像下面这样使用:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
WindowInsetsController windowInsetsController = decorView.getWindowInsetsController();
windowInsetsController.setSystemBarsBehavior(
WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
);
windowInsetsController.hide(
WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()
);
window.setDecorFitsSystemWindows(false);
} else {
(...)
}
正如谷歌人员(如 Chris Banes)所解释的,Window.setDecorFitsSystemWindows(false) 几乎等同于 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 并且 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 与 SYSTEM_UI_FLAG_LAYOUT_STABLE。至少阴影效果没有问题。
关于android - 重叠阴影效果保留在 Navigation Drawer 的 NavigationView 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32798793/
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde
我想查找字符串的结尾是否与单独字符串的开头重叠。例如,如果我有这两个字符串:string_1='Peoplesaynothingisimpossible,butI'string_2='butIdonothingeveryday.'如何找到string_1末尾的“butI”部分与string_2开头相同?我可以编写一个方法来遍历这两个字符串,但我希望得到一个包含我错过的Ruby字符串方法或Ruby习惯用法的答案。 最佳答案 将MARKER设置为一些从未出现在您的string_1和string_2中的字符串。有一些方法可以动态地做到这一
我知道我能做到:(1..30).cover?(2)=>true但是当我尝试对另一个范围执行相同操作时,它总是返回false:(1..30).cover?(2..3)=>false所以我的问题是-是否有任何优雅的方法来比较ruby中的两个范围?在我的例子中,我想检查两个日期时间范围是否重叠。提前致谢。 最佳答案 给定范围A的两个范围重叠,当:范围B从范围A开始,范围B在范围A内结束或范围B在范围A之前开始,在范围A之后结束例子:RangeA|-----||-----|Case1|-----|Case2|-|Case1+2|----
ruby调试器不会在我在与执行开始时不同的文件中设置的断点处停止。例如,考虑这两个文件,foo.rb:#foo.rbclassFoodefbarputs"baz"endend和main.rb:#main.rbrequire'./foo'Foo.new.bar我使用ruby-rdebug.\main.rb开始调试。现在,当我尝试使用b./foo.rb:4在另一个文件的特定行上设置断点时,我收到消息Setbreakpoint1atfoo.rb:4,但是当我cont时,程序执行到最后,调试器永远不会停止。但是,如果我在main.rb中的一行上打断,例如b./main.rb:3,或者一个方法,
当我对两个数组进行交集时,是否可以保证生成的顺序基于第一个数组的顺序?例如,如果我有a=[1,2,3]b=[3,2,1]可以a&b返回[3,2,1],而不是[1,2,3](这是什么我希望)?我在RDoc或Pickaxe的Array文档中找不到任何直接解决这个问题的内容。RubySpec有一个规范,它createsanarraywithelementsinordertheyarefirstencountered,但我是否应该假设YARVRuby会遵守该规范? 最佳答案 看起来这是一项有保证的功能。他们在revision39415中升级
今天我在我的Rails控制台中尝试了一些东西,这发生了,2.0.0p247:009>Date.today-29.days=>Fri,07Feb20142.0.0p247:010>Date.today-29.days=>Thu,09Jan2014我很困惑。我可以看到我缺少一些基本的东西。但这让我印象深刻!谁能解释为什么会这样? 最佳答案 实际发生的是这样的:Date.today(-29.days)#=>Fri,07Feb2014today有一个名为start的可选参数,默认为Date::ITALY。Anoptionalargument
视频教程:https://www.bilibili.com/video/BV1WJ411778C/?spm_id_from=333.999.0.0&vd_source=4a4c35da6aef7094d5990c213c39aa09使用素材(推荐使用GitZipforgithub下载):https://github.com/zheyuanzhou/Youtube-Unity-Tutorial/tree/master/EP45_Health%20Bar/Sprites效果如下图所示:首先在场景中创建一个新的Canvas,并命名为HeathBar,并创建三个Image作为前者的子物体,分别命名为
我正在通过EdgeCaseRubyKoans(www.rubykoans.com)进行黑客攻击,并且卡在about_methods.rbhere中从第35行开始的方法上。.运行rake可预见地失败并告诉我查看第36行。我有理由确定我的assert_match是正确的(“0代表2”),但我不知道是什么失败了。assert_raise(___)行很可能应该在括号之间包含一些内容,但我不知道那应该是什么。任何提示或轻推?非常感谢。编辑:这是有问题的代码的一小段:defmy_global_method(a,b)a+bend-剪辑-deftest_calling_global_methods_w
我需要实现预订功能并确保预订不会在Rails应用中重叠。cover?和between?方法并不是我所需要的。与同一模型上的其他潜在范围相比,我必须确保时间范围的唯一性,并且要高效地做到这一点。我认为可以使用overlaps?来完成.问题是,对于这样的事情,它会返回TRUE:(1..5).overlaps?(5..9)=>true如果我比较一个预订在另一个预订开始时结束(3:30-4:00与4:00-4:30),它会说他们做重叠,但他们在技术上没有。那会有问题吗?ValidatesOverlap似乎可以解决这个问题,包括边缘重叠。有什么建议吗? 最佳答案