Android tips

用于记录Android开发中一些常用的代码和小技巧,方便查询和使用。
目前记录的有:

  • 使用gradle生成不同的包名和应用名
  • 使用gradle往资源文件中添加数据
  • 使用gradle自动生成apk文件名
  • Android 6.0以上实现深色模式
  • 设置TextView中的可点击链接

Gradle

配置构建类型和产品类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//必须要有默认的类型,名字可以自定义
flavorDimensions "default"
productFlavors {
dev {
// resConfigs "xxxhdpi" 可以指定使用的资源文件
resValue("string", "app_name", "影库(Dev)")
}
prod {
resValue("string", "app_name", "影库")
}
}

buildTypes {
debug {
applicationIdSuffix ".debug"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
debuggable true
jniDebuggable false
renderscriptDebuggable false
renderscriptOptimLevel 3
zipAlignEnabled true
shrinkResources false
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
ndk {
abiFilters "armeabi", "armeabi-v7a"
}
}
}

通过gradle写入字符串到资源文件

1
2
3
4
5
6
7
8
9
10
buildTypes.each {
Properties properties = new Properties()
properties.load(project.rootProject.file("local.properties").newDataInputStream())
def tmdbApiKey = properties.getProperty("tmdb_api_key", "")

it.buildConfigField 'String', "TMDB_API_KEY", tmdbApiKey

it.resValue 'string', "api_key", tmdbApiKey

}

指定构建生成的apk名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
applicationVariants.all { variant ->
variant.outputs.all { output ->
delete fileTree(output.outputFile.parent)
def SEP = "_"
def appName = "影库"
def dateTime = new Date().format("yyyyMMdd_HHmm")
def productFlavor = variant.productFlavors[0].name
def buildType = variant.buildType.name
def versionCode = variant.versionCode
def versionName = variant.versionName
// e.g. 影库_20180809_dev_22_4.4.2.apk
def apkName = appName + SEP + dateTime + SEP + productFlavor + SEP + versionCode + SEP + versionName + ".apk"
outputFileName = apkName
}
}

UI

Android 6.0以上深色模式

1
2
3
4
5
6
7
8
9
10
11
12
13


<style name="Base.AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">

<item name="colorPrimary">@color/colorPrimaryitem>
<item name="colorPrimaryDark">@color/colorPrimaryDarkitem>


<item name="android:windowLightStatusBar" tools:targetApi="m">@bool/use_light_statusitem>
<item name="android:statusBarColor">@color/transparentitem>
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">@bool/use_light_navigationitem>

style>

改变activity的主题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@SuppressLint("WrongConstant")
fun AppCompatActivity.updateForTheme(theme: Theme) = when (theme) {
Theme.DARK -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES
Theme.LIGHT -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_NO
Theme.SYSTEM -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
Theme.BATTERY_SAVER -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY
}
@SuppressLint("WrongConstant")
fun updateForTheme(delegate: AppCompatDelegate, theme: Theme) = when (theme) {
Theme.DARK -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES
Theme.LIGHT -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_NO
Theme.SYSTEM -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
Theme.BATTERY_SAVER -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY
}

设置TextView中的可点击链接

TextView加载Html后,可能需要对于html中的链接可以点击,可以采用如下代码实现点击效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span){
int start = strBuilder.getSpanStart(span);
int end = strBuilder.getSpanEnd(span);
int flags = strBuilder.getSpanFlags(span);
ClickableSpan clickable = new ClickableSpan() {
public void onClick(View view) {
// Do something with span.getURL() to handle the link click...
}
};
strBuilder.setSpan(clickable, start, end, flags);
strBuilder.removeSpan(span);
}

protected void setTextViewHTML(TextView text, String html){
CharSequence sequence = Html.fromHtml(html);
SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
for(URLSpan span : urls) {
makeLinkClickable(strBuilder, span);
}
text.setText(strBuilder);
text.setMovementMethod(LinkMovementMethod.getInstance());
}
 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×