android 4.2 隐藏/显示 navigation bar, 实现全屏显示
2013-09-25 10:03
288 查看
引子: eoe 上有人实现了 android 4.0 下 隐藏/显示 navigation bar, 实现全屏显示的方法(http://www.eoeandroid.com/thread-246825-1-1.html?_dsign=0fde0ea0), 跟贴者很多, 也有很多人在问4.2 下如何实现, 借由作者的思路,我在android 4.2 实现隐藏/显示 navigation bar, 代码如下。
1. /base/packages/SystemUI/src/com/android/systemui/SystemUI.java
在SystemUI.java 中添加 onReceive() 方法.
package com.android.systemui;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import android.content.Context;
import android.content.res.Configuration;
public abstract class SystemUI {
public Context mContext;
public abstract void start();
public void onReceive(String action) {
}
protected void onConfigurationChanged(Configuration newConfig) {
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
}
}
2. /frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java 的onCreate方法中去注册一个广播
//add by huangbozhi
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION_DISPLAY_STATUS_BAR);
intentFilter.addAction(ACTION_HIDE_STATUS_BAR);
registerReceiver(mStatusBarReceiver, intentFilter);
//add by huangbozhi
这里有两个广播ACTION_DISPLAY_STATUS_BAR 和 ACTION_HIDE_STATUS_BAR, 目的是接收应用发出的广播, 发出隐藏广播时, 则隐藏导航栏,
发出显示广播时, 则显示导航栏, ACTION_DISPLAY_STATUS_BAR 和 ACTION_HIDE_STATUS_BAR 是自已定义的, 就在 SystemUIService.java 里
//add by huangbozhi
public static final String ACTION_DISPLAY_STATUS_BAR = "com.android.action.display_navigationbar";
public static final String ACTION_HIDE_STATUS_BAR = "com.android.action.hide_navigationbar";
//add by huangbozhi
3. 在SystemUIService.java 中接收来自应用层的广播
//add by huangbozhi
BroadcastReceiver mStatusBarReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && !TextUtils.isEmpty(intent.getAction())) {
String action = intent.getAction();
Log.d(TAG, "*** onReceive(), action = " + action + " ***");
final int N = SERVICES.length;
for (int i = 0; i < N; i++) {
Slog.d(TAG, "invoke: " + mServices[i] + "'s onReceive()");
if(mServices[i] instanceof PhoneStatusBar){
mServices[i].onReceive(action);
}
}
}
}
};
注意红色标记部分, 因为PhoneStatusBar 继承自SystemUI.java, 所以我们在PhoneStatusBar
中去重写onReceive方法。
4. 在PhoneStatusBar 中去重写onReceive方法。
//add by huangbozhi
public void onReceive(String action) {
if (SystemUIService.ACTION_DISPLAY_STATUS_BAR.equals(action)) {
Log.d(TAG, "*** onReceive() show" );
addNavigationBar();
} else if (SystemUIService.ACTION_HIDE_STATUS_BAR.equals(action)) {
Log.d(TAG, "*** onReceive() hide" );
mWindowManager.removeView(mNavigationBarView);
}
}
这样SystemUI 里的改动完成了。
5. 应用层实现;
隐藏时就发 sendBroadcast(new Intent("com.android.action.hide_navigationbar"));
显示时就发 sendBroadcast(new Intent("com.android.action.display_navigationbar"));
1. /base/packages/SystemUI/src/com/android/systemui/SystemUI.java
在SystemUI.java 中添加 onReceive() 方法.
package com.android.systemui;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import android.content.Context;
import android.content.res.Configuration;
public abstract class SystemUI {
public Context mContext;
public abstract void start();
public void onReceive(String action) {
}
protected void onConfigurationChanged(Configuration newConfig) {
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
}
}
2. /frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java 的onCreate方法中去注册一个广播
//add by huangbozhi
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION_DISPLAY_STATUS_BAR);
intentFilter.addAction(ACTION_HIDE_STATUS_BAR);
registerReceiver(mStatusBarReceiver, intentFilter);
//add by huangbozhi
这里有两个广播ACTION_DISPLAY_STATUS_BAR 和 ACTION_HIDE_STATUS_BAR, 目的是接收应用发出的广播, 发出隐藏广播时, 则隐藏导航栏,
发出显示广播时, 则显示导航栏, ACTION_DISPLAY_STATUS_BAR 和 ACTION_HIDE_STATUS_BAR 是自已定义的, 就在 SystemUIService.java 里
//add by huangbozhi
public static final String ACTION_DISPLAY_STATUS_BAR = "com.android.action.display_navigationbar";
public static final String ACTION_HIDE_STATUS_BAR = "com.android.action.hide_navigationbar";
//add by huangbozhi
3. 在SystemUIService.java 中接收来自应用层的广播
//add by huangbozhi
BroadcastReceiver mStatusBarReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && !TextUtils.isEmpty(intent.getAction())) {
String action = intent.getAction();
Log.d(TAG, "*** onReceive(), action = " + action + " ***");
final int N = SERVICES.length;
for (int i = 0; i < N; i++) {
Slog.d(TAG, "invoke: " + mServices[i] + "'s onReceive()");
if(mServices[i] instanceof PhoneStatusBar){
mServices[i].onReceive(action);
}
}
}
}
};
注意红色标记部分, 因为PhoneStatusBar 继承自SystemUI.java, 所以我们在PhoneStatusBar
中去重写onReceive方法。
4. 在PhoneStatusBar 中去重写onReceive方法。
//add by huangbozhi
public void onReceive(String action) {
if (SystemUIService.ACTION_DISPLAY_STATUS_BAR.equals(action)) {
Log.d(TAG, "*** onReceive() show" );
addNavigationBar();
} else if (SystemUIService.ACTION_HIDE_STATUS_BAR.equals(action)) {
Log.d(TAG, "*** onReceive() hide" );
mWindowManager.removeView(mNavigationBarView);
}
}
这样SystemUI 里的改动完成了。
5. 应用层实现;
隐藏时就发 sendBroadcast(new Intent("com.android.action.hide_navigationbar"));
显示时就发 sendBroadcast(new Intent("com.android.action.display_navigationbar"));
相关文章推荐
- android隐藏底部虚拟键Navigation Bar实现全屏
- Android 4.2 通过修改FrameWork源码实现动态隐藏导航栏,实现全屏
- android隐藏底部虚拟键Navigation Bar实现全屏(虚拟按键home,back,menu)
- android隐藏底部虚拟键Navigation Bar实现全屏
- android隐藏底部虚拟键Navigation Bar实现全屏
- Android 隐藏状态栏和Actionbar实现全屏显示
- Android 4.2 原生系统有哪些方法实现全屏下隐藏导航栏?
- android隐藏底部虚拟键Navigation Bar实现全屏
- Android 全屏显示-隐藏Navigation Bar
- android隐藏底部虚拟键Navigation Bar实现全屏
- android隐藏底部虚拟键Navigation Bar实现全屏
- Android 4.2 原生系统有哪些方法实现全屏下隐藏导航栏?
- Android 4.2 通过修改FrameWork源码实现动态隐藏导航栏,实现全屏
- Android编程实现播放视频时切换全屏并隐藏状态栏的方法
- Android View深入学习——实现QQ滑动显示隐藏按钮ListView
- android4.4+实现MD状态栏并全屏显示内容
- 解析android中隐藏与显示软键盘及不自动弹出键盘的实现方法
- Android实现标题显示隐藏功能
- Xamarin 中开发Android实现全屏或者不显示标题栏的方法-宋兴柱
- Android 显示隐藏密码的简单实现