1.布局适配用sw限定符适配方法
2.全面屏、刘海屏、水滴屏适配
AndroidManifest.xml 中
application下增加 android:resizeableActivity="false" (意思是不可以分屏显示)与下面搭配必须为false
<meta-data android:name="android.max_aspect" android:value="2.4" /> 意思是适配最大长宽比(自己理解,不造对不对)
3.曲面屏底部导航栏遮挡了 底部布局,需要把内容布局的高度缩小,撑起导航栏
1)布局文件中底部需要避开遮挡的布局的背景设置: android:background="?android:attr/windowBackground" windowBackground 的颜色设置需要在styles.xml : AppTheme : <item name="android:windowBackground">@color/dialog_comment_bot_bg_color</item> 2)在activity oncreate方法中
if(NavigationBarUtil.hasNavigationBar(this)){ NavigationBarUtil.initActivity(findViewById(android.R.id.content)); }
import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; import android.os.Build; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import java.lang.reflect.Method; /** * 底部导航栏在曲面屏设置为全面屏时时,下部因为曲面原因遮挡 * 此时就要给底部留出空间来 才不会被遮挡 * 布局文件中底部需要避开遮挡的布局的背景设置: android:background="?android:attr/windowBackground" * windowBackground 的颜色设置需要在styles.xml : AppTheme : <item name="android:windowBackground">@color/dialog_comment_bot_bg_color</item> */ public class NavigationBarUtil { public static void initActivity(View content) { new NavigationBarUtil(content); } private View mObserved;//被监听的视图 private int usableHeightView;//视图变化前的可用高度 private ViewGroup.LayoutParams layoutParams; private NavigationBarUtil(View content) { mObserved = content; //给View添加全局的布局监听器监听视图的变化 mObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { resetViewHeight(); } }); layoutParams = mObserved.getLayoutParams(); } /** * 重置视图的高度,使不被底部虚拟键遮挡 */ private void resetViewHeight() { int usableHeightViewNow = CalculateAvailableHeight(); //比较布局变化前后的View的可用高度 if (usableHeightViewNow != usableHeightView) { //如果两次高度不一致 //将当前的View的可用高度设置成View的实际高度 layoutParams.height = usableHeightViewNow; mObserved.requestLayout();//请求重新布局 usableHeightView = usableHeightViewNow; } } /** * 计算试图高度 * * @return */ private int CalculateAvailableHeight() { Rect r = new Rect(); mObserved.getWindowVisibleDisplayFrame(r); return (r.bottom - r.top);//如果不是沉浸状态栏,需要减去顶部高度 // return (r.bottom );//如果是沉浸状态栏 } /** * 判断底部是否有虚拟键 * * @param context * @return */ public static boolean hasNavigationBar(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; } public static void setNavigationBarColor(Activity activity,int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().setNavigationBarColor(activity.getResources().getColor(color)); } } }
4.其他
<!-- 全局去除textView的文本框上下间距、设置行间距、设置字体 --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:textViewStyle">@style/MyTextViewStyle</item> <item name="android:fontFamily">@font/sanshansregular</item> <item name="android:windowBackground">@color/dialog_comment_bot_bg_color</item> </style>
<!-- 全局去除textView的文本框上下间距、设置行间距 --> <style name="MyTextViewStyle" parent="android:Widget.TextView"> <item name="android:includeFontPadding">false</item> <item name="android:lineSpacingExtra">@dimen/qb_px_20</item> </style>
5. 设置字体
res/font/sanshansmedium.otf sanshansregular.otf
可以在布局文件中设置
android:fontFamily="@font/sanshansmedium"