电话号码:
国际号码区号选择控件:CountryCodePicker
电话格式验证(国际号码): libphonenumber
颜色渐变:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:angle="90"
android:endColor="@color/colorPrimary"
android:startColor="@color/colorAccent" />
</shape>
[gradient] 声明该shape的属性-渐变色,除此外还有其他属性如corners、stroke、size等等
[android:angle]渐变色的角度,举例来说,0代表从上至下颜色渐变;45代表从左至右颜色渐变;90代表从下至上颜色渐变…
[android:startColor&android:endColor] 渐变开始的颜色和渐变结束时的颜色
Android沉浸式状态栏实现:
https://juejin.im/post/5989ded56fb9a03c3b6c8bde
android沉浸式状态栏蒙灰:
在setContentView()之前添加代码:
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //去除半透明状态栏
谷歌搜索:
在搜索内容后加 “ -关键词 ” 可以屏蔽相关的信息 例如 “love -YouTube” 就可以过滤掉来着YouTube的信息,这点可以在我们使用url拼接时起到过滤的作用,可用于爬数据
Android版本bug 8.0:
Android8.0不能同时把activity设置为强制竖屏和沉浸式,会导致闪退崩溃。
既不能在AndroidManifest同时设置
android:screenOrientation="portrait"
android:theme="@style/translucent"
<style name="translucent" parent="AppTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
</style>
弹窗第三方:
可以简单实现对弹窗位置的控制,点击事件,蒙层等。
https://github.com/razerdp/BasePopup
解析视频网站:
可以利用webview代码调用其,实现对多个网站视频来源的解析
示例代码:
class InnerJSInterface {
@JavascriptInterface
public void parseSource(String source, String checkUrl, boolean second) {
//视频的来源url
List<String> list = new ArrayList();
try {
Document document = Jsoup.parse("<!DOCTYPE html><html lang=\"en\">" + source + "</html>");
boolean match = false;
for (Element element : document.getElementsByTag("div")) {
if (element.classNames().contains("night-white") && element.classNames().contains("items-center") && element.classNames().contains("px-3")) {
for (Element child : element.getElementsByTag("div")) {
if (child.text().equalsIgnoreCase("mp4") && child.classNames().contains("w-24")) {
match = true;
}
}
if (!match) {
continue;
}
for (Element child : element.getElementsByTag("div")) {
if (child.classNames().contains("w-full") && child.classNames().contains("mt-6")) {
String url = child.getElementsByTag("a").get(0).attr("href");
list.add(url);
}
}
}
}
} catch (Exception e) {
}
}
}
--------------------------
private void query9xbuddy(String webUrl) {
WebView parseWebView = new WebView(this);
WebSettings settings = parseWebView.getSettings();
String userAgent = settings.getUserAgentString();
parseWebView.addJavascriptInterface(new InnerJSInterface(), "localInterface");
settings.setJavaScriptEnabled(true);
settings.setBlockNetworkImage(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
parseWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
parseWebView.setWebChromeClient(new WebChromeClient() {
boolean isOnec = true;
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress >= 99 && ("https://9xbuddy.com/process?url=" + webUrl).equals(view.getOriginalUrl())) {
if (isOnec) {
view.evaluateJavascript("javascript:window.localInterface.parseSource("
+ "document.getElementsByTagName('html')[0].innerHTML,'" + webUrl + "',false);", null);
}
isOnec = false;
}
}
});
parseWebView.loadUrl("https://9xbuddy.com/process?url=" + webUrl);
}
-
反编译apk
https://github.com/ufologist/onekey-decompile-apk
-
方法数超过限制
implementation 'com.android.support:multidex:1.0.3'
-
消息通知适配
https://segmentfault.com/a/1190000017186150
-
导入新的第三方库,或升级原有的库的版本时出错
可以试试把Android库升级到AndroidX,因为很多新的库或版本是依赖AndroidX进行开发的,在studio中可以一键升级,也建议都用AndroidX进行开发,毕竟谷歌做了很多的优化升级。
在顶部工具栏: Refactor中找到 Migrate to AndroidX (如果没有,可以升级studio的版本)
-
ScrollView嵌套RecyclerView
https://www.jianshu.com/p/5ba68d088c60
-
实现冷热启动指定先打开某一个页面,例如广告页面,加载页面等
https://www.jianshu.com/p/6482b89fe506
android:launchMode="singleTask"
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
可以通过对要求页面设置这些属性来实现
-
杀死自己应用的进程
android.os.Process.killProcess(android.os.Process.myPid());
-
获取当前屏幕是熄屏还是显示(View的display的state方法)
mBottom.getDisplay().getState()
-
获取当前APP的系统位置
高版本的安卓不允许在自己应用以外的位置创建新文件,所以需要在该目录下进行文件读写,不然创建文件时会一直返回false
MApp.getInstance().getApplicationContext().getFilesDir().getAbsolutePath()