如何关闭导航栏
问题:如图所示,我们想导航栏与页面融为一体:
办法:在 com/example/ecgphone/MainActivity.java
中使用代码:
// 将顶部状态栏设置为透明,关闭顶部状态栏的高度
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
setContentView(R.layout.activity_main);
效果:
可以看到顶部状态栏成功融入页面。
如何关闭摄像头黑边
问题:如图所示,在页面左边因为存在摄像头刘海屏,导致摄像头区域全为黑边
办法:在 values/themes.xml
中使用代码:
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
效果:
成功关闭左边黑边!!!
参考链接:Android刘海屏横屏时有黑边不全屏的解决方案
http 明文引用问题
现象:
Log打印报错:
Network request failed
java.net.UnknownServiceException: CLEARTEXT communication to 40c53f71.r27.cpolar.top not permitted by network security policy
at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:188)
at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226)
at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
at java.lang.Thread.run(Thread.java:1012)
问题分析:从Android 9(API level 28)开始,默认情况下不允许明文HTTP通信。
办法一:使用HTTPS
如果服务器支持HTTPS,使用HTTPS URL代替HTTP URL。
http://... ------> https://...
办法二:允许明文HTTP通信
修改应用的网络安全配置,允许明文HTTP通信。在res/xml目录创建network_security_config.xml的文件,并写入代码:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">这里填http://(这部分)</domain>
</domain-config>
</network-security-config>
然后,AndroidManifest.xml中引用这个配置文件:
<application
...
android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
在Fragment活动文件中使用toast
方法:
getActivity().runOnUiThread(() ->
Toast.makeText(getActivity(), "Response: " + responseData, Toast.LENGTH_SHORT).show()
);
解释:
1 getActivity().runOnUiThread(() -> { … }):
- getActivity() 获取当前 fragment 所附加的 Activity。
- runOnUiThread() 方法用于确保指定的代码在主线程(也称为 UI 线程)上运行。Android 要求所有与 UI 相关的操作必须在主线程上执行。
- () -> { … } 是一个 lambda 表达式,用于定义在主线程上执行的代码。
2 为什么需要在主线程上运行?
在 Android 中,只有主线程可以更新 UI 元素。如果尝试在工作线程(如网络请求回调线程)中直接更新 UI,会导致应用崩溃。因此,需要使用 runOnUiThread() 将 UI 更新操作切换到主线程上执行。
更改APP头像,且适应各种大小
在 Android Studio 中,更换应用程序的图标(软件头像)涉及修改应用的资源文件,以下是步骤:
- 准备图标图像文件:图标应该是 PNG 格式的图片。
- 使用 Image Asset 工具:右键点击 app 文件夹,选择 New > Image Asset
- 配置图标:选择图标类型:Launcher Icons (Adaptive and Legacy) 或 Legacy Only,在 Path 部分,点击 Clip Art 或 Image,并选择你准备好的图标文件,配置其他选项,如前景层和背景层(如果适用)。
- 生成图标:选择 Next,点击 Finish,Android Studio 将会自动生成并放置适当尺寸的图标到 res/mipmap 文件夹中。
- 更新 AndroidManifest.xml
- Build > Clean Project,Build > Rebuild Project