导航:首页 > APP软件 > 安卓获取actionbar为空

安卓获取actionbar为空

发布时间:2025-05-26 19:33:37

1. 怎么给APP适配高版本安卓系统

Android的最新版本会提供一些很棒的API,您的APP使用新版本API的同时也要兼容旧的Android版本,直到更多设备已更新到新版本的APP。本文档将向您展示如何利用最新的API,同时继续支持旧版本。

根据对访问Google Play商店的设备数量的统计,平台版本分布表会进行定期更新,以显示运行每个版本的Android设备的分布情况。一般来说,一个APP最好能支持大约90%的活动设备,同时使用最新的Android版本。

提示:为了在多个Android版本中提供最佳特性和功能,您应该在APP中使用Android Support Library,这样可以在旧版本上使用几种最新的平台API。

指定Minimum和Target API Levels

AndroidManifest.xml文件描述APP的详细信息,并标识其支持的Android版本。具体来说,<uses-sdk>元素的minSdkVersion和targetSdkVersion属性标识了APP兼容的最低和最高API级别。
随着新版Android的发布,一些风格和行为可能会有所改变。为了让您的应用程序能够利用这些更改,并确保您的应用程序适合每个用户设备的风格,您应该把targetSdkVersion的值设置为最新的Android版本。

在运行时检查系统版本

Android在Build常量类中为每个平台版本提供了一个唯一的编码。APP用这个编码来确保只有系统支持高版本API时,才会执行依赖高版本API的代码
注意:解析XML资源时,Android会忽略当前设备不支持的XML属性。因此,您可以安全地使用仅由较新版本支持的XML属性,而不必担心旧版本遇到该代码时出错。例如,如果您设置targetSdkVersion =“11”,则APP在Android 3.0及更高版本上默认包含ActionBar。如果要将menu项添加到action bar,您需要在menu资源XML中设置android:showAsAction =“ifRoom”。 在跨版本的XML文件中可以安全地执行此操作,因为较旧版本的Android只会忽略showAsAction属性(即,不需要在res / menu-v11 /中添加一个单独的menu资源)。

2. 如何控制android系统中NavigationBar 的显示与隐藏

我们使用的大多数android手机上的Home键,返回键以及menu键都是实体触摸感应按键。如果你用Google的Nexus4或Nexus5话,你会发现它们并没有实体按键或触摸感应按键,取而代之的是在屏幕的下方加了一个小黑条,在这个黑条上有3个按钮控件,这种设置无疑使得手机的外观的设计更加简约。但我遇到身边用Nexus 4手机的人都吐槽这种设计,原因很简单:好端端的屏幕,被划出一块区域用来显示3个按钮(如下图所示):Back, Home, Recent。并且它一直用在那里占用着。

在android源码中,那一块区域被叫做NavigationBar。同时,google在代码中也预留了标志,用来控制它的显示与隐藏。NavigationBar的显示与隐藏的控制是放在SystemU中的,具体的路径是:\frameworks\base\packages\SystemUI。对android4.0以上的手机而言,SystemUi包含两部分:StatusBar和NavigationBar。在SystemUI的工程下有一个类PhoneStatusBar.java,在该类中可以发现关于控制NavigationBar的相关代码:

在start()方法里可以看到NavigationBar是在那时候被添加进来,但只是添加,决定它显示还是隐藏是在后面控制的。

<span style="font-size:18px;">@Override
public void start() {
mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
updateDisplaySize();

/// M: Support Smartbook Feature.
if (SIMHelper.isMediatekSmartBookSupport()) {
/// M: [ALPS01097705] Query the plug-in state as soon as possible.
mIsDisplayDevice = SIMHelper.isSmartBookPluggedIn(mContext);
Log.v(TAG, "start, mIsDisplayDevice=" + mIsDisplayDevice);
}

super.start(); // calls createAndAddWindows()

addNavigationBar();

// Lastly, call to the icon policy to install/update all the icons.
mIconPolicy = new PhoneStatusBarPolicy(mContext);

mHeadsUpObserver.onChange(true); // set up
if (ENABLE_HEADS_UP) {
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(SETTING_HEADS_UP), true,
mHeadsUpObserver);
}
}</span>
其中的addNavigationBar()具体的实现方法如下:

<span style="font-size:18px;"> // For small-screen devices (read: phones) that lack hardware navigation buttons
private void addNavigationBar() {
if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);
if (mNavigationBarView == null) return;

prepareNavigationBarView();

mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
}</span>
可以看到Navigationbar实际上windowmanager向window窗口里添加一个view。在调用addNavigationBar()方法之前会回调start()的父方法super.start()来判断是否要添加NavigationBar。在super.start()的调用父类方法里会调用createAndAddWindows(),该方法内会判断是否需要添加显示NavigationBar,然后决定是否要实例化NavigationBarView.
<span style="font-size:18px;">try {
boolean showNav = mWindowManagerService.hasNavigationBar();
if (DEBUG) Slog.v(TAG, "hasNavigationBar=" + showNav);
if (showNav) {
mNavigationBarView =
(NavigationBarView) View.inflate(context, R.layout.navigation_bar, null);

mNavigationBarView.setDisabledFlags(mDisabled);
mNavigationBarView.setBar(this);
}
} catch (RemoteException ex) {
// no window manager? good luck with that
}</span>
WindowManagerService类实现了WindowManagerPolicy的接口,所以WindowManagerService会回调WindowManagerPolicy 的hasNavigationBar()接口,

<span style="font-size:18px;"> @Override
public boolean hasNavigationBar() {
return mPolicy.hasNavigationBar();
}</span>

Policy向下调用实际上调用的是PhoneWindowManager实现的hasNavigationBar方法,下面代码是PhoneWindowManager中的hasNavigationBar()方法。
<span style="font-size:18px;">// Use this instead of checking config_showNavigationBar so that it can be consistently
// overridden by qemu.hw.mainkeys in the emulator.
public boolean hasNavigationBar() {
return mHasNavigationBar;
}</span>
而mHasNavigationBar的赋值可以在PhoneWindowManager中的setInitialDisplaySize(Display display, int width, int height, int density)方法中找到,

<span style="font-size:18px;"> if (!mHasSystemNavBar) {
mHasNavigationBar = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_showNavigationBar);
// Allow a system property to override this. Used by the emulator.
// See also hasNavigationBar().
String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");
if (! "".equals(navBarOverride)) {
if (navBarOverride.equals("1")) mHasNavigationBar = false;
else if (navBarOverride.equals("0")) mHasNavigationBar = true;
}
} else {
mHasNavigationBar = false;
}</span>
从上面代码可以看到mHasNavigationBar的值的设定是由两处决定的:
1.首先从系统的资源文件中取设定值config_showNavigationBar, 这个值的设定的文件路径是frameworks/base/core/res/res/values/config.xml
<!-- Whether a software navigation bar should be shown. NOTE: in the future this may be
autodetected from the Configuration. -->
<bool name="config_showNavigationBar">false</bool>
2.然后系统要获取“qemu.hw.mainkeys”的值,这个值可能会覆盖上面获取到的mHasNavigationBar的值。如果 “qemu.hw.mainkeys”获取的值不为空的话,不管值是true还是false,都要依据后面的情况来设定。
所以上面的两处设定共同决定了NavigationBar的显示与隐藏。

阅读全文

与安卓获取actionbar为空相关的资料

热点内容
win10进入bios取消密码 浏览:538
dnf90版本属强什么好 浏览:211
苹果文件目录实用工具在哪里 浏览:163
微信视频最大发多少MB文件 浏览:1
粉笔app申论解析在哪里看 浏览:740
Linux拷贝文件目录下的所有 浏览:281
哪些量是数据量 浏览:172
qq默认文件保存位置 浏览:978
极米app找不到文件 浏览:722
苹果手机在哪里开数据连接 浏览:282
苹果手机如何删除垃圾 浏览:749
什么是网站的faq 浏览:193
在南宁找工作有哪些网站 浏览:723
ps4bin文件 浏览:840
社保系统数据保存在电脑哪里 浏览:868
wordpress的别名获得页面的别名 浏览:26
档案文件柜多少钱一张 浏览:137
图形编程一级测评成绩如何划分 浏览:971
易语言分割文件 浏览:403
电视剧批量修改文件名 浏览:213

友情链接