# android_question_anwser
**Repository Path**: sscl/android_question_anwser
## Basic Information
- **Project Name**: android_question_anwser
- **Description**: 安卓开发中遇到的问题与解决方案
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-08-29
- **Last Updated**: 2025-01-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# android_question_anwser
安卓常见问题与解决方案记录
有新的问题可以提到issue中,我会整理后更新这些问题
还有一些我自己用过比较好用的库,我也整理到了另一个仓库中,有需要可以前往查看 [https://gitee.com/sscl/android_usefull_responsitory](https://gitee.com/sscl/android_usefull_responsitory)
### 引入aar包(jar包同理)
在需要引入包的module的build.gradle中加入这些依赖库,加入的位置如下
```xml
android {
...
}
dependencies {
...
//在此处添加依赖
}
```
#### 方式1:
```xml
//引入指定的aar库(下方的aars表示与module目录中"src"文件夹同级的目录名,可以是libs,也可以是新建的其它文件目录)
//每次同名的aar文件有变更时不会实时生效,需要注释后同步一次,再取消注释后同步一次可生效
implementation files("aars/xxxx.aar")
```
目录结构如图:

#### 方式2:
```xml
//引入aars目录下的所有aar包(每次有新的aar或同名的aar文件有变更时不会实时生效,需要注释后同步一次,再取消注释后同步一次可生效)
implementation fileTree(include: ['*.aar'], dir: 'aars')
```
### 更改Activity supportActionbar/actionbar的“3点菜单”按钮(溢出菜单图标)颜色
更改style文件
```xml
```
### 更改Activity supportActionbar/actionbar 菜单选项(溢出菜单的Item)文本的颜色
```xml
```
### 通过更改主题变更Button的默认文本颜色
```xml
```
### Button的background属性无效
方式1
```xml
```
方式2
```xml
```
### 判断当前Activity是否用户可见
java
```java
public boolean isActivityVisible(Activity activity){
return activity.getWindow().getDecorView().getVisibility() == View.VISIBLE;
}
```
kotlin
```kotlin
fun isActivityVisible(activity:Activity):Boolean{
return activity.window.decorView.visibility == View.VISIBLE
}
```
### 绑定 TabLayout与Fragment
使用TabLayoutMediator类即可
kotlin
```kotlin
TabLayoutMediator(tabLayout,viewPager2,{ tab, position ->
//TODO configure the tab for the page at position
//TODO 为当前位置的tab配置一些基本属性
})
```
java
```java
new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> {
//TODO configure the tab for the page at position
//TODO 为当前位置的tab配置一些基本属性
});
```
### string.xml 前后的' '(空格字符)会被trim
使用转义字符   替换单个 ' ',有几个替换几个
```xml
测试文本
测试文本
```
### 常用xml转义字符及表示方式
```xml
不断行的空白(1个字符宽度)
半个空白(1个字符宽度)
一个空白(2个字符宽度)
窄空白(小于1个字符宽度)
< 小于号
> 大于号
& 与符号
' 单引号
" 双引号
```
### 更改Android Studio生成的APK文件的名称
在项目的主module的build.gradle中配置
```gradle
android {
···
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
applicationVariants.all {
variant ->
variant.outputs.all {
output -> outputFileName = "你想更改的应用名称.apk"
}
}
}
···
}
```
### 配置签名
在项目的主module的build.gradle中配置
```gradle
android {
···
signingConfigs {
def alias = "alias" //签名文件内,签名的别名
def password = "aliasPassword" //签名文件内,指定签名的别名后,该签名的密码
def filePath = "signture.jks" //签名文件路径,默认目录与build.gradle文件路径一致,可用 "./" 或 "../"配置相对路径,也可直接填入完整的绝对路径
def storePassword1 = "signtureFilePassword" //签名文件密码
//debug签名
debug {
keyAlias alias
keyPassword password
storeFile file(filePath)
storePassword(storePassword1)
}
//release签名,可手动更改,配置与debug时不同的参数
release {
keyAlias alias
keyPassword password
storeFile file(filePath)
storePassword(storePassword1)
}
}
···
}
```
### ComponentActivity.startActivityForResult被弃用
```java
//声明 ActivityResultLauncher
private ActivityResultLauncher activityResultLauncher;
//重写onStart方法,并在该方法中注册 ActivityResult,并将返回值赋值到activityResultLauncher
@Override
protected void onStart() {
activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() {
@Override
public void onActivityResult(ActivityResult result) {
//在此处处理 onActivityResult 即可
}
});
super.onStart();
}
private void toTargetActivity(){
Intent intent = new Intent(this,TargetActivity.class);
//使用 activityResultLauncher 替代 startActivityForResult
activityResultLauncher.launch(intent);
}
```
```kotlin
private var activityResultLauncher: ActivityResultLauncher? = null
override fun onStart() {
activityResultLauncher = registerForActivityResult(StartActivityForResult()) {
val resultCode = it.resultCode
val intent = it.data
//TODO 你想做的操作
}
super.onStart()
}
```
### 进入Activity时,不自动弹出软键盘
1. 在 AndroidManifest.xml文件中的activity节点下添加如下代码
```xml
android:windowSoftInputMode="stateHidden|adjustPan"
```
2.在onCreate方法中调用如下代码
```java
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
```
### 让EditText闪烁光标的同时又不调起软键盘
```java
EditText edit= (EditText) view.findViewById(R.id.edit);
if (android.os.Build.VERSION.SDK_INT <= 10) {
edit.setInputType(InputType.TYPE_NULL);
} else {
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
try {
Class cls = EditText.class;
Method setSoftInputShownOnFocus;
setSoftInputShownOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
setSoftInputShownOnFocus.setAccessible(true);
setSoftInputShownOnFocus.invoke(edit, false);
} catch (Exception e) {
e.printStackTrace();
}
}
```
# Android Studio Giraffe新特性(gradle dls)
## build.gradle.kts
### 配置程序签名,将正确的文件名,文件密码,key名,key密码填入即可(如果密码不对,可以试试互换文件密码与key密码)
```kts
android {
...
signingConfigs {
//创建release签名
create("release") {
storeFile = file("xxx.jks")
storePassword = "xxx"
keyAlias = "***"
keyPassword = "***"
}
//更改debug签名
val debugConfig = maybeCreate("debug")
debugConfig.storeFile = file("xxx.jks")
debugConfig.storePassword = "xxx"
debugConfig.keyAlias = "***"
debugConfig.keyPassword = "***"
}
...
}
```
### 开启dataBinding与viewBinding
```kts
android{
...
buildFeatures {
dataBinding = true
viewBinding = true
}
...
}
```
### 重命名生成的 apk 文件名称
```
android {
archivesName.set("你的 apk 文件名(不要带 .apk 后缀)")
}
```
## setting.gradle.kts
### 添加自定义maven url
```kts
dependencyResolutionManagement {
repositories {
//jitpack仓库
maven { url = URI("https://jitpack.io") }
//阿里云仓库
maven {
url = URI("https://maven.aliyun.com/nexus/content/repositories/releases/")
}
}
}
```