1.一个APP只需要一个Activity

    //片段fragmentimplementation 'me.yokeyword:fragmentation:1.3.6'implementation 'me.yokeyword:fragmentation-swipeback:1.3.6'

2.懒人必备查找控件

//ButterKnife(10.0必须适配AndroidX,9.0需要java8,快速生成插件android-butterknife-zelezny)implementation 'com.jakewharton:butterknife:9.0.0'annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0'

3.方法数超过65k,合并

  • a.引入jar包
    implementation "com.android.support:multidex:1.0.3"

  • b.配置合并dex为开启
    defaultConfig {multiDexEnabled true}

  • c.在自己的MyApplication下的方法中初始化
  @Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);MultiDex.install(this);}

4.新版本的Gradle,需要至少在一个Activity中的 <intent-filter>里面添加:

 <action android:name="android.intent.action.VIEW" />

5.拉的自己封装的工具类需要去掉,.git的关联

https://blog.csdn.net/lyj1005353553/article/details/55519487

6.设置去掉所有的页面标题栏

在AppTheme中配置

 <item name="windowNoTitle">true</item>

7.快速构建Builder插件

innerbuilder插件

8.使用Dagger2无法找到对于的Component类,

a.必须在基类的onCreate方法中注入

    @Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);DaggerCommonComponent.create().inject(this);}

而不要注入到另一个onCreate中

    @Override
public void onCreate( @Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {super.onCreate(savedInstanceState, persistentState);
}

9.RecyclerView嵌套ScrollView不流畅

recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);

垂直滑动问题:
https://segmentfault.com/a/1190000011553735
recyclerview嵌套在NestedScrollView里,一次性加载出全部数据问题
https://github.com/CymChad/BaseRecyclerViewAdapterHelper/issues/1954
Android SwipeRefreshLayout和RecyclerView嵌套时 下拉刷新冲突的解决办法
https://blog.csdn.net/peirato_/article/details/54913195

针对RecyclerView不显示,只需要设置ScrollView的属性android:layout_height="match_parent" android:fillViewport="true" 就OK了。
  • 监听RecyclerView滚动距离
 //RecyclerView滚动监听recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);switch (newState){case RecyclerView.SCROLL_STATE_IDLE://现在不是滚动状态L.e("滚动的距离=="+direction);break;case RecyclerView.SCROLL_STATE_DRAGGING://手指 拖动break;case RecyclerView.SCROLL_STATE_SETTLING://惯性滚动break;}}@Overridepublic void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);//计算RecyclerView滚动的距离direction += dy;}});

RecyclerView解决数据混乱,禁止复用

recyclerView.getRecycledViewPool().setMaxRecycledViews(viewType,0);

https://blog.csdn.net/adojayfan/article/details/87934157

10.Retrofit网络请求,生成

 private static void setRetrofit(String defaultHost) {retrofit = new Retrofit.Builder().baseUrl(defaultHost).client(okHttpClient).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(JSONObjectConverterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build();}

其中JSONObjectConverterFactory和GsonConverterFactory不能共存,如果想返回JSONObject对象,去掉 .addConverterFactory(GsonConverterFactory.create())如果想直接生成Object对象,去掉.addConverterFactory(JSONObjectConverterFactory.create())

11.TextView加入删除线

tv.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);

代码中绘制左侧图片

Drawable img = layout.getResources().getDrawable(R.drawable.icon);
// 调用setCompoundDrawables时,必须调用Drawable.setBounds()方法,否则图片不显示
img.setBounds(0, 0, img.getMinimumWidth(), img.getMinimumHeight());
textView.setCompoundDrawables(img, null, null, null); //设置左图标

文字滚动消息:

 < TextViewandroid:layout_width ="wrap_content"android:layout_height ="wrap_content"android:focusable ="true"android:focusableInTouchMode ="true"android:marqueeRepeatLimit ="marquee_forever"android:ellipsize ="marquee"android:singleLine ="true"android:text ="那么什么是成功的人生,什么样的人又是成功人士呢?像科技界的比尔?盖茨 ,乔布斯 ,商界的巴菲特以及娱乐、体育界的大腕,无疑会被人们视为是成功者。但对于普通民众,如果用比尔?盖茨那样的标准来衡量是否成功似乎有些太苛刻,也不现实。在某种观念中,一个人的成功似乎与财富分不开的。很多国人到美国看到华人最常说的一句话是,你是个成功人士。为什么这么说?因为你能住300平方米、价值百万美元的房子,因为你开的车是奔驰 、宝马等豪华车,因为你有好的工作,年薪至少在10万美元以上。这也许是很多国人看待一个人成功与否的主要标志。但在美国人眼里,成功并不是与拥有众多财富密不可分。在1980年代,多数美国人把拥有更多财富看成人生成功的一个主要标志。而在一项最新的调查中,对于美国人来说,财富不再是成功的最重要组成部分。调查中22个成功人生的潜在组成因素中,“有很多钱”仅排名在第20位。" />

12.对Retrofit回调进行封装,只输出正确和错误信息

自定义Retrofit网络回调结果

13.EditText变搜索按钮,并监听搜索事件

xml中设置android:imeOptions="actionSearch"android:singleLine="true"
代码中

        etSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {if (actionId == EditorInfo.IME_ACTION_SEARCH){String keyWord = v.getText().toString();if (TextUtils.isEmpty(keyWord)){ToastUtil.showLong("请输入搜索内容!");return false;}//开始搜索keyWord相关内容}return false;}});

14.CoordinatorLayout布局要设置滚动控件的

app:layout_behavior="@string/appbar_scrolling_view_behavior"

里面的字符串爆红,但还是可以运行,但红色总是不好看的,可能是新版本的sdk引起的,所以需要改为

app:layout_behavior ="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"

15.WebView不跳转到外部浏览器

class MyWebViewClient extends WebViewClient{//不跳转到外部浏览器public boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;}}

Android webview loadData 中文乱码
https://www.jianshu.com/p/85957f003dd4

webview加载html图片过大左右滑动的解决/webview加载图片自适应大小

16.WebView出现net::ERR_UNKNOWN_URL_SCHEME错误

https://www.jianshu.com/p/119823e5cfb5

17.Glide显示图片为上面圆角,下面直角

让Glide输出指定位置的圆角图片 2018年,部分方法为Glide4.0以前的,所以无法使用,但方法值得借鉴
Glide 加载部分圆角图片2019年,新的方法,且行为更合理
圆角不圆:有可能是因为图片高度或宽度过大,导致部分圆角不圆
Glide ViewTarget及SimpleTarget加载问题:

18.View转换为Bitmap

private Bitmap loadBitmapFromView(View v) {int w = v.getWidth();int h = v.getHeight();Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);Canvas c = new Canvas(bmp);c.drawColor(Color.WHITE);/** 如果不设置canvas画布为白色,则生成透明 */v.layout(0, 0, w, h);v.draw(c);return bmp;}

关于View转化成bitmap保存成图片
两个Bitmap合并为一个
Android:将一个Activity、某块布局转换成图片

19.使用xml绘制虚线好后,4.0以上需要使用 android:layerType="software"属性,不然虚线会变为实线

https://blog.csdn.net/Small_Lee/article/details/52153557

20.微信分享到朋友圈,调用系统分享,需要对Uri单独处理一下

https://blog.csdn.net/qq_34900897/article/details/85320646

21.support版本冲突的解决办法

https://blog.csdn.net/yuzhiqiang_1993/article/details/78214812

22.TabLayout+ViewPager垂直方向联动,用于分类页面

https://www.jianshu.com/p/9266e58cc4f5

23.精确计算RecyclerView滑动高度

SlideRecyclerView

24.adb无线调试

https://jingyan.baidu.com/article/066074d610f4f3c3c21cb0ab.html

25.打包名称自定义

https://www.cnblogs.com/bluestorm/p/6228085.html
https://blog.csdn.net/weixin_33709364/article/details/87160660
打包方法过时警告:https://www.cnblogs.com/blogs-of-lxl/p/10306145.html
我的通用命名方式:包名最后一部分+版本名称+时间+打包方式 taobao_v1.0_2019-05-20_release
在android{}里面写入


android.applicationVariants.all { variant ->variant.outputs.all{outputFileName  = "${applicationId.subSequence(applicationId.lastIndexOf(".")+1,applicationId.length())}_v${versionName}_${releaseTime()}_${baseName}.apk"}}

其中releaseTime()为写在android{}外部的一个方法

def releaseTime() {return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

26.apk签名打包,

如何配置签名及生成签名文件:
https://www.cnblogs.com/details-666/p/keystore.html
如何判断你的apk是否已经签名:
https://blog.csdn.net/qq_21376985/article/details/53337977

27.混淆

https://blog.csdn.net/qq634416025/article/details/79686051

28.TextView设置可滚动的方式

xml中设置TextView属性

android:scrollbars="vertical"

同时代码中设置

 textView.setMovementMethod(ScrollingMovementMethod.getInstance());

29.Android:通过Glide保存图片到本地,并同步到相册

30.Android 调用系统分享(不使用第三方),指定QQ、微信等

https://blog.csdn.net/u010356768/article/details/78246691
qq空间限制:
https://blog.csdn.net/weixin_41239127/article/details/78743421

31.安卓从imageview中获得bitmap的方法

https://blog.csdn.net/yj1499945/article/details/47079621

32.怎样获取到Android控件的高度,通过监听的方式

https://www.jianshu.com/p/2c8e5324ec68

你可能也不知道为什么,第一次进入页面,获取控件的高度有值,再次进入获取的高度居然为0,再再再次进入也为0,杀掉应用,进入页面又有高度了,再次进入又为0。因为我需要通过view来获取Bitmap,那么View的宽高值必不可少,所以我通过上面博客的方法去监听控件的高度才拿到值。但为什么只有第一次进入才能拿到宽高值却拜师不得琪姐,请各位大老解答。

33.AccessibilityService获取控件信息getRootInActiveWindow() 经常为null

https://blog.csdn.net/qq_28210079/article/details/80486592

33.解决android.permission.WRITE_APN_SETTINGS

https://blog.csdn.net/qq_36437339/article/details/81015715

34.新手引导库

GuideView

在Fragment中由于控件位置绘制流程和生命周期的关系,需要监听控件View宽高,有值后才进行引导层的绘制,同时用Handler进行一定的延迟绘制,保证高亮区域的定位精确度

35.Java中对对象进行排序

https://blog.csdn.net/qq_37937537/article/details/80445731

通过Comparable

36.监控当前APP是否回到前台

https://www.jianshu.com/p/101eb42d0fde

37.使用java8新特性快速的打印输出序列对象

allList.stream().map(User::toString).forEach(L::e);

38.Fragment的优化

不要再Activity中使用List来保存Fragment
https://blog.csdn.net/qq_30993595/article/details/80736814

39.ViewPager2,支持横竖布局,支持0预加载布局

https://juejin.im/post/5cda3964f265da035d0c9d8f

40.RadioGroup.onCheckedChanged() 会调用多次

https://blog.csdn.net/qq_32452623/article/details/80474487

41.Retrofit2上传图片

https://www.cnblogs.com/zhujiabin/p/7601658.html

42.Java多线程

Java多线程系列目录(共43篇)

43.ArrayList进行排序

24版本以前的老方法:
Collections.sort(arrays);
新方法
arrays.sort();

44.对时间的转换,对比,添加,格式输出

joda-time

45. tools:replace的使用

tools:replace=""有时候需要替换多个项,使用逗号分割
tools:replace="android:allowBackup,android:appComponentFactory"

46. 解决 导入三方时出现: appComponentFactory 错误

https://blog.csdn.net/qq_34224268/article/details/83861897

47. 滚轮时间选择器

可以采用 XPopupWheelPicker
组合的方式来生成一个时间选择器如:https://www.jianshu.com/p/4a2c853d9276

48. fragment里coordinatorlayout+viewpager无法正常滑动问题

fragment里coordinatorlayout+viewpager无法正常滑动问题
有人说fragment是无法运行协调者布局的,这是错误的
解决方法:在你的viewpager子fragment里面布局最外面套上一层NestedScrollView就可以了

49.查看SHA1命令

keytool -list -v -keystore C:\Users\Desktop\browser\debug.keystore -storepass android
后面的android为当前密钥的密码

50.RecyclerView横向分页菜单

https://blog.csdn.net/u014165119/article/details/46834265

51.ArgbEvaluator一个计算颜色渐变值的类

https://blog.csdn.net/u013581141/article/details/68063469
使用事例:自定义CoordinatorLayout.Behavior颜色渐变的TitleBar

52.交互效果咋了系列:

自定义ViewGroup第十三式之移花接木

53.数据绑定DataBind

android {…dataBinding {enabled = true}
}

告别findView和ButterKnife
Android开发教程 - 使用Data Binding(七)使用BindingAdapter简化图片加载

54.错误检查命令

gradlew processDebugManifest --stacktrace

55.new Handler的警告说明和解决办法@SuppressLint(“HandlerLeak”)

https://blog.csdn.net/androidsj/article/details/79865091

    private MyHandler myHandler = new MyHandler(_mActivity);private static class MyHandler extends Handler {WeakReference weakReference;public MyHandler(Activity activity) {weakReference = new WeakReference(activity);}@Overridepublic void handleMessage(Message msg) {}}

另一种写法:

private Handler mHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {return false;}});

56.多行且需要最后显示省略号的警告处理

logcat 总是报: W/StaticLayout: maxLineHeight should not be -1. maxLines:1 lineCount:1

57.通知无法显示:8.0需要设置渠道和权重

https://www.jianshu.com/p/f85ef58edf63

58.uri指向了外部应用exposed beyond app through RemoteViews.setUri()

在Application中的onCreate方法中添加如下

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();StrictMode.setVmPolicy(builder.build());builder.detectFileUriExposure();

59.解决因为弹窗导致TextView停止滚动的问题:

https://www.jianshu.com/p/22b4aff0dc8e

60.弹窗需要一个自定义的三角形SanJiaoView

https://blog.csdn.net/ZhangLei280/article/details/73207669

61.升级AndroidX后出现缺失AppBarLayout$ScrollingViewBehavior

https://www.jianshu.com/p/6b8104787617

62.APP启动时间,性能优化,启动页白屏

https://www.jianshu.com/p/75b0b128c470

63.AndroidStudio安装失败

image.png

方法一:clean项目
方法二:重启大法:重启AndroidStudio,重启手机,重启电脑,重启...
方法三:检查是否只开启了开发者模式和USB调试,却没有开启了USB安装

image.png

64.adb命令

https://www.jianshu.com/p/56fd03f1aaae

65.ConstraintLayout基础 及动态控件(动画效果)

https://www.jianshu.com/p/7888cde8292f

66.获取videoView第一针视频报错:

https://blog.csdn.net/guohesheng/article/details/80236799

67.Math函数相关计算

//角度换算为对应数值
double skewRot = Math.toRadians(30);

68. banner库一张图片无效和第一次进入没有轮播的时候点击第一张无效

一张图片的时候需要设置banneronClick事件,多张图第一次还未开始轮播点击无效,需要先设置点击事件,再调用bannerstart方法

69. <activity-alias> 标签的使用

<activity-alias> 标签的使用

70.Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK

https://blog.csdn.net/watermusicyes/article/details/44963773

71.程序崩溃日志收集

 Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread thread, final Throwable ex) {// Custom code here to handle the error.L.e("发生崩溃=="+thread.getName()+"  =="+ex.getMessage());}});

72.Android Q正式发布。新一代的安卓系统非常注重对用户隐私的保护,它限制APP获取IMEI、DEVICE ID等移动端设备标识码,解决方案:

简书:https://www.jianshu.com/p/df3f549ddd35
官方:https://developer.android.google.cn/training/articles/user-data-ids

73.再按一次退出程序

    private long firstTime = 0;@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_BACK:long secondTime = System.currentTimeMillis();//如果两次按键时间间隔大于2秒,则不退出if (secondTime - firstTime > 2000) {Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();firstTime = secondTime;//更新firstTimereturn true;//两次按键小于2秒时,退出应用} else {System.exit(0);}break;}return super.onKeyUp(keyCode, event);}

如果是Fragment请不要复写onBackPressed()方法,改为复写onBackPressedSupport():

    //再按一次退出程序private long firstTime = 0;@Overridepublic void onBackPressedSupport() {long secondTime = System.currentTimeMillis();if (getSupportFragmentManager().getBackStackEntryCount() == 1 && secondTime - firstTime > 2000) {Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();firstTime = secondTime;} else {super.onBackPressedSupport();}}

74.AndroidX升级日记

https://www.jianshu.com/p/499e645ad148

75.AndroidStudio启动模拟器Android10.0报错

Emulator: Process finished with exit code -1073741819 (0xC0000005)
https://stackoverflow.com/questions/47631771/emulator-process-finished-with-exit-code-1073741819-0xc0000005

76.简单实现ImageView宽度填满屏幕,高度自适应的两种方式

https://www.jianshu.com/p/c9424615e99d

77.RecyclerView瀑布流问题

https://www.jianshu.com/p/4e142909b824
https://blog.csdn.net/tobevan/article/details/78924338

78.android studio关闭字符串资源多语言提示

https://blog.csdn.net/sinat_26814541/article/details/97757535

79.ConstraintLayout 采用代码方式布局用法简介

http://xgfe.github.io/2017/09/17/ivanchou/layout-with-constraintlayout-by-programming/

80.Glide获得图片资源,并高斯模糊

高斯模糊是个耗时过程,需要在子线程进行操作

        try {Drawable drawable = Glide.with(mContext).load(item.getImage_url()).apply(RequestOptions.bitmapTransform(new BlurTransformation(15, 1))).submit().get();layoutRoot.setBackground(drawable);} catch (ExecutionException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}

高斯模糊

public class BlurTransformation extends BitmapTransformation {private static final int VERSION = 1;private static final String ID = "BlurTransformation." + VERSION;
private static int MAX_RADIUS = 25;private static int DEFAULT_DOWN_SAMPLING = 1;private int radius;private int sampling;public BlurTransformation() {this(MAX_RADIUS, DEFAULT_DOWN_SAMPLING);}public BlurTransformation(int radius) {this(radius, DEFAULT_DOWN_SAMPLING);}public BlurTransformation(int radius, int sampling) {this.radius = radius;this.sampling = sampling;}@Overrideprotected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {int width = toTransform.getWidth();int height = toTransform.getHeight();int scaledWidth = width / sampling;int scaledHeight = height / sampling;Bitmap bitmap = pool.get(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);canvas.scale(1 / (float) sampling, 1 / (float) sampling);Paint paint = new Paint();paint.setFlags(Paint.FILTER_BITMAP_FLAG);canvas.drawBitmap(toTransform, 0, 0, paint);bitmap = FastBlur.blur(bitmap, radius, true);return bitmap;}@Override public String toString() {return "BlurTransformation(radius=" + radius + ", sampling=" + sampling + ")";}@Override public boolean equals(Object o) {return o instanceof BlurTransformation &&((BlurTransformation) o).radius == radius &&((BlurTransformation) o).sampling == sampling;}@Override public int hashCode() {return ID.hashCode() + radius * 1000 + sampling * 10;}@Override public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {messageDigest.update((ID + radius + sampling).getBytes(CHARSET));}
}

其中的FastBlur来至库glide-transformations

81.Glide获得获取图片主体色系

  Glide.with(mContext).load(item.getImage_url()).listener(GlidePalette.with(item.getImage_url()).use(GlidePalette.Profile.VIBRANT).intoBackground(layoutRoot, GlidePalette.Swatch.RGB).crossfade(true)).into(imageView);

82.Android获取内网IP

方法一:

  package com.rongyan.clienttest;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NetWorkUtil {//匹配C类地址的IPpublic static final String regexCIp = "^192\\.168\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)$";//匹配A类地址public static final String regexAIp = "^10\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)$";//匹配B类地址public static final String regexBIp = "^172\\.(1[6-9]|2\\d|3[0-1])\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)$";public static String getHostIp() {String hostIp;Pattern ip = Pattern.compile("(" + regexAIp + ")|" + "(" + regexBIp + ")|" + "(" + regexCIp + ")");Enumeration<NetworkInterface> networkInterfaces = null;try {networkInterfaces = NetworkInterface.getNetworkInterfaces();} catch (SocketException e) {e.printStackTrace();}InetAddress address;while (networkInterfaces.hasMoreElements()) {NetworkInterface networkInterface = networkInterfaces.nextElement();Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();while (inetAddresses.hasMoreElements()) {address = inetAddresses.nextElement();String hostAddress = address.getHostAddress();Matcher matcher = ip.matcher(hostAddress);if (matcher.matches()) {hostIp = hostAddress;return hostIp;}}}return null;}
}

方法二:

    public String getWifiIp() {//获取wifi服务WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);//判断wifi是否开启if (!wifiManager.isWifiEnabled()) {wifiManager.setWifiEnabled(true);}WifiInfo wifiInfo = wifiManager.getConnectionInfo();int ipAddress = wifiInfo.getIpAddress();return intToIp(ipAddress);}//获取Wifi ip 地址private String intToIp(int i) {return (i & 0xFF) + "." +((i >> 8) & 0xFF) + "." +((i >> 16) & 0xFF) + "." +(i >> 24 & 0xFF);}

参考:https://www.cnblogs.com/jxust-jiege666/p/8168149.html

83.Android获取外网IP

参考:https://www.jianshu.com/p/1e3eaf887191

方法一,通过访问第三方接口地址来获取

import org.json.JSONException;
import org.json.JSONObject;/*** 获取外网IP地址* @return*/public void GetNetIp() {new Thread(){@Overridepublic void run() {String line = "";URL infoUrl = null;InputStream inStream = null;try {infoUrl = new URL("http://pv.sohu.com/cityjson?ie=utf-8");URLConnection connection = infoUrl.openConnection();HttpURLConnection httpConnection = (HttpURLConnection) connection;int responseCode = httpConnection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {inStream = httpConnection.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "utf-8"));StringBuilder strber = new StringBuilder();while ((line = reader.readLine()) != null)strber.append(line + "\n");inStream.close();// 从反馈的结果中提取出IP地址int start = strber.indexOf("{");int end = strber.indexOf("}");String json = strber.substring(start, end + 1);if (json != null) {JSONObject jsonObject = null;try {jsonObject = new JSONObject(json);} catch (JSONException e) {e.printStackTrace();}line = jsonObject.optString("cip");}L.e("line=="+line);Message msg = new Message();msg.what = 1;msg.obj = line;}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}.start();}

84.颜色均匀渐变的动画

ValueAnimator animator = ValueAnimator.ofInt(0xffffff00,0xff0000ff);
animator.setEvaluator(new ArgbEvaluator());
animator.setDuration(3000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {int curValue = (int)animation.getAnimatedValue();tv.setBackgroundColor(curValue);
<span class="token punctuation">}</span>


http://www.taodudu.cc/news/show-2873828.html

相关文章:

  • 这4款数据自动化探索 Python 神器,解决99%的数据分析问题!
  • 计算机的本质到底是什么?
  • 大厂前端面试都问些什么问题?入职爱奇艺年薪48万,面试经验总结
  • 盘点程序员可以在上面捡钱的共享经济产品
  • 《一个投资家的20年》读书笔记
  • 【转】【公司调查】车来了APP
  • 《名利场》:微软 “ 失落的十年”
  • 写给还在迷茫中的朋友,一名6年程序员的工作感悟!!!
  • python爬取视频--下载2019巴菲特股东大会直播视频
  • 《滚雪球:巴菲特和他的财富人生》【美】艾丽斯·施罗德著
  • 巴菲特经典演讲《价值投资为什么能够持续战胜市场》
  • HTML5中利用JavaScript实现拖放(来回)的案例
  • 如何把带图片html转为doc,教您一招:如何将图片里面的文字转成word格式并能编辑...
  • c语言求成绩中的最高分辨率大约是,一级msoffice全真机试试卷.docx
  • 15 个 Python 开源项目,使用 PyQt 做小型桌面应用!
  • Burp Suite使用介绍(一)
  • ABBYY FineReader:PDF转换、一键OCR、图片转文字等,OCR识别一遍帮你搞定。
  • 如何批量用扫描仪扫描照片_如何用手机扫描旧照片
  • (1)【数据隐藏】一起入门隐写吧,宝?word、图像、移动设备、文件压缩数据隐藏
  • 网站使用手机相机_使用“互通相机”把你的iPhone手机变成Mac的心灵之窗!
  • 互联网界的IT巨变:从DOS的编辑器,到如今的无代码开发
  • 使用charCodeAt()和charAt()方法,根据Unicode 编码,转换字符
  • 串口屏应用案例_大彩串口屏在高拍仪上的应用方案
  • 方正高拍仪文件上传到服务器,高拍仪拍摄文件后如何进行文字识别?本地文件能否导入高拍仪进行识别?...
  • python-机器学习-决策树实现
  • 算法笔记——数学相关
  • YBT 6 数学基础
  • python实现堆栈_Python堆栈实现计算器
  • 如何给电脑安装双系统,电脑安装双系统教程
  • 在家无聊就重装个系统吧 三分钟教你重装安装系统

Android项目120项相关推荐

  1. android simple-xml,使用Maven构建Android项目-dexer在simple-xml依赖项上失败

    我有绝对空的Android项目生成 mvn archetype:generate -DarchetypeArtifactId=android-quickstart ....... 它构建良好,部署合理 ...

  2. 我的Android进阶之旅------Android项目目录结构分析

    此文章来自"博客园"博主,仅在此借鉴,学习 1.HelloWorld项目的目录结构 1.1.src文件夹 1.2.gen文件夹 1.3.Android 2.1文件夹 1.4.ass ...

  3. 使用gradle构建android项目,Android中使用Gradle来构建App项目的入门指南

    gradle是Android开发中引入的全新的构建系统,因为全新的构建系统主要是出于下面的目的: 1. 方便复用代码和资源 2. 构建多种版本的apk更见简单,不论是为多渠道构建不同的apk还是构建不 ...

  4. 在 Jenkins 中使用声明式 Pipeline 构建 Android 项目

    Blue Ocean 是 Jenkins 推出的一套新的 UI,对比经典 UI 更具有现代化气息.2017 年 4 月 James Dumay 在博客上正式推出了 Blue Ocean 1.0. 兼容 ...

  5. XamarinSQLite教程在Xamarin.Android项目中使用数据库

    XamarinSQLite教程在Xamarin.Android项目中使用数据库 在Xamarin.Android项目中使用预设数据库的具体操作步骤如下: (1)创建一个Xamarin.Android项 ...

  6. gradle构建android项目

    工具: Android Studio2.0 gradle-2.10 一.Android常识 在做Android开发的时候我们首先必须要有一个SDK.一般SDK的主要作用就是将硬件和软件进行分离,做软件 ...

  7. Android项目目录结构分析

    此文章来自"博客园"博主,仅在此借鉴,学习 1.HelloWorld项目的目录结构 1.1.src文件夹 1.2.gen文件夹 1.3.Android 2.1文件夹 1.4.ass ...

  8. 在原有Android项目中快速集成React Native

    前言 对于现有的大多数项目来说都不是从头构建的,而要在原有项目的基础上引入React Native则肯定和用react-native init xxx创建工程不同.因此下面就来说下具体操作.不过在真正 ...

  9. android circleimageview 导入到eclipse,android项目从Eclipse迁移到Android studio中常见问题解决方法.pdf...

    android项项目目从从Eclipse迁迁移移到到Android studio 中中常常见见问问题题解解决决方方法法 android项目从Eclipse迁移到Android studio中经常会遇到 ...

最新文章

  1. 微生物组入门必读+宏基因组实操课程=新老司机赶快上车
  2. Computational methods for analysis of single molecule sequencing data
  3. MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength
  4. influx测试——单条读性能很差,大约400条/s,批量写性能很高,7万条/s,总体说来适合IOT数据批量存,根据tag查和过滤场景,按照时间顺序返回...
  5. 超图桌面版开发入门图解
  6. webpack原理探究 打包优化
  7. 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)
  8. 密码学系列之:内容嗅探
  9. 《挖财编程题》求数列的和
  10. 聊聊高并发(十七)解析java.util.concurrent各个组件(一) 了解sun.misc.Unsafe类
  11. 解决python2.7 UnicodeDecodeError和UnicodeEncodeError问题
  12. 按值传递时 php必须复制值,PHP笔试题汇总
  13. 关于opencv读取摄像头的未解之谜
  14. ADB投屏_最强开源投屏神器,跨平台电脑控制+文件传输——scrcpy
  15. nvidia的jetson系列的方案_NVIDIA Jetson 平台
  16. 慢牛系列五:用百度语音识别添加自选股
  17. 异构计算:PC的“动车组”
  18. Linux内核研究系列之可执行文件格式(转)
  19. python爬取百度的工具_Python爬虫之小试牛刀——使用Python抓取百度街景图像
  20. matlab只读改为可修改,matlab – 获取绘图的只读属性名称列表

热门文章

  1. STM32-USB学习系列(四):USB-HID模拟鼠标功能
  2. Controllable Generation from Pre-trained Language Models via Inverse Prompting翻译
  3. 核酸检测预约和结果查询系统
  4. 星光大道视频播放器精品版
  5. 职高计算机教学案例 反思,教学案例分析反思
  6. Win7下eclipse ADT调试cocos2dx-lua工程
  7. 【R语言】ggplot2作图补充(1)
  8. 想做游戏测试工程师?这几点不知道可不行!
  9. java斗地主发牌_java斗地主发牌程序
  10. b3dm ~ ( Batched 3D Model )