转自 https://blog..net/lancelots/article/details/82864210
老板写到很好,我都用上了,另外,我在上面加了一点点东西,就是当添加一个按钮或者图标,想要做相应功能,在文章最后有添加的。(备注: 我的是Android 8.1、rk3368的)
----------------------------------------------------------------------------
转自 https://blog..net/lancelots/article/details/82864210
Android 7.0的代码和6.0有很大变化,在导航栏上添加图标修改的文件更多些,
我先列出需要修改的文件:
1,frameworks/base/packages/SystemUI/res/layout/mark.xml
2,frameworks/base/packages/SystemUI/res/drawable-sw600dp/custom_mark.png
3,frameworks/base/packages/SystemUI/res/values-sw600dp/config.xml
4,frameworks/base/SystemUI/res/values-sw600dp/config.xml
5,frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
6,frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
下面一个一个把修改的文件代码列出,首先是mark.xml文件,Andoid 7.0的recent,back,home定义按键都是定义xml文件.我也是按照这三个按键的定义标准来.
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
>
android:id="@+id/markTest"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginEnd="2dp"
android:src="@drawable/custom_mark"
android:scaleType="centerInside"
systemui:keyCode="82"
android:contentDescription="@string/accessibility_menu"
/>
2,custom_mark.png就是mark.xml所引用的图片,这个没什么说的,随便找一张图片就行
3,frameworks/base/packages/SystemUI/res/values-sw600dp/config.xml文件
mark;back,home,recent,allapps;space //在这里添加mark
4,frameworks/base/packages/SystemUI/res/values/config.xml文件
mark;back,home,recent,allapps;space //同样添加mark
5,frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java文件
@Nullable
protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape,
int indexInParent) {
LayoutInflater inflater = landscape ? mLandscapeInflater : mLayoutInflater;
float size = extractSize(buttonSpec);
String button = extractButton(buttonSpec);
View v = null;
if("mark".equals(button)){ //判断当前的keyguarButton,如果是mark的话,inflate它
v = parent.findViewById(R.id.markTest);
if (null == v) {
isAddToParent = true;
v = inflater.inflate(R.layout.mark, parent, false);
}
changeViewPaddingAndWidth(v,landscape,mIsBookuiMode);
}
6,frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java文件
public ButtonDispatcher getMarkButton() { //定义获取mark的方法
return mButtonDisatchers.get(R.id.markTest);
}
public void setDisabledFlags(int disabledFlags, boolean force) {
if (!force && mDisabledFlags == disabledFlags) return;
mDisabledFlags = disabledFlags;
......
getMarkButton().setVisibility(View.VISIBLE); //在这里设置图标可见
......
}
然后可以单独编译一下SystemUI,就可以看到自己的图标出现到导航栏上了~
--------------------------------------------------------------------------
另外,在8.1版本添加按键事件(其他版本不知道):
….\SystemUI\src\com\android\systemui\statusbar\phone\NavigationBarFragment.java
prepareNavigationBarView(){
//添加响应方法
ButtonDispatcher hideButton = mNavigationBarView.getHideButton();
hideButton.setOnClickListener(this::onHideClick);
}
private voidonHideClick(View v) {
//添加对应的方法
Intent intent = new Intent();
intent.setAction(INCAR_SYSTEM_HIDE);
getContext().sendBroadcast(intent);
}