轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!
- GitHub: @Ricco
最近開發(fā)的項(xiàng)目,用到了Dialog,要求是底部彈出,完全沒有問題,這很簡(jiǎn)單,但是當(dāng)拿出Android studio的虛擬機(jī)[Galaxy Nexus API 25]測(cè)試的時(shí)候,發(fā)現(xiàn),底部的虛擬按鍵會(huì)阻擋Dialog自己定義的布局,簡(jiǎn)單的實(shí)現(xiàn)一下。
ps:我現(xiàn)在分享的項(xiàng)目代碼并沒有完美解決,需要配合Activity的布局才能實(shí)現(xiàn)。
先上代碼
DialogUtil.class 用于隱藏高版本的新手機(jī)的虛擬按鍵
public class DialogUtil {
public static Window getDialogWindow(Context context, Dialog mDialog) {
final Window dialogWindow = mDialog.getWindow();
if (checkDeviceHasNavigationBar(context)) {
//存在的時(shí)候設(shè)置
dialogWindow.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
dialogWindow.getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
int uiOptions =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
// 布局位于狀態(tài)欄下方
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
// 全屏
// View.SYSTEM_UI_FLAG_FULLSCREEN |
// 隱藏導(dǎo)航欄
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
if (Build.VERSION.SDK_INT >= 19) {
uiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
} else {
uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
dialogWindow.getDecorView().setSystemUiVisibility(uiOptions);
}
});
}
dialogWindow.setGravity(Gravity.BOTTOM);
dialogWindow.setWindowAnimations(R.style.DialogStyle);
return dialogWindow;
}
//判斷是否有虛擬按鍵
private static boolean checkDeviceHasNavigationBar(Context context) {
boolean hasNavigationBar = false;
Resources rs = context.getResources();
int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
if (id > 0) {
hasNavigationBar = rs.getBoolean(id);
}
try {
Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
Method m = systemPropertiesClass.getMethod("get", String.class);
String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
if ("1".equals(navBarOverride)) {
hasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {
hasNavigationBar = true;
}
} catch (Exception e) {
}
return hasNavigationBar;
}
}
MainActivity.class
private Dialog mDialog;
private void showDialog() {
mDialog= new Dialog(this, R.style.MyDialog);
LinearLayout root = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.dialog, null);
// 取消
root.findViewById(R.id.iv_dialog_cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDialog.cancel();
}
});
// 確定
root.findViewById(R.id.tv_dialog_ok).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 邏輯
mDialog.cancel();
}
});
// 其他代碼...
mDialog.setContentView(root);
Window dialogWindow = DialogUtil.getDialogWindow(this, mDialog);
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.x = 0;
lp.y = -20;
lp.width = getResources().getDisplayMetrics().widthPixels;
root.measure(0, 0);
lp.height = root.getMeasuredHeight();
dialogWindow.setAttributes(lp);
mDialog.show();
}
res/values/styles.xml
<style name="MyDialog">
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
<!--控制Dialog出現(xiàn),消失的動(dòng)畫-->
<style name="DialogStyle" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/dialog_enter</item>
<item name="@android:windowExitAnimation">@anim/dialog_exit</item>
</style>
res/anim/dialog_enter.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromYDelta="100%p" />
</set>
res/anim/dialog_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:toYDelta="100%p" />
</set>