android开发实用小技巧

android开发实用小技巧
字符串相关
格式化字符串,可以使用String类的format(String,Object…)方法,如果要格式化资源文件strings.xml中的字符串,可以使用getResources().getString(int,Object…)方法

String.format(“money:¥%.2f”,1.00);

money:$%.2f

getResources().getString(R.string.format,1.00);

当字符串里有%时,参数formatted为false%100
对于11位手机号,自动添加空格需求,只要添加以下监听器就可以了
mMobileEt.addTextChangedListener(new PhoneNumberFormattingTextWatcher(Locale.CHINA.getCountry()));
PhoneNumberUtils.formatNumber(num,“CN”)格式化电话号码
DateUtils.getRelativeTimeSpanString(long startTime)返回 “几天前”/“xx days ago” 格式的字符串
android.text.format.Formatter.formatFileSize(Context, long)方法,用来格式化文件Size(B → KB → MB → GB);
Log.getStackTraceString(e)可以将异常信息转换成字符串的形式
Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[];StackTraceElement类,其中四个方法getClassName(),getFileName(),getLineNumber(),getMethodName()在调试程序打印Log时非常有用;
TextUtils 是一个非常好用的工具类,把 List 转成字符串,逗号分隔,逗号分隔的 String 字符串,切割成 List ,分别可以用 TextUtils 的 join 和 split 方法。如果要对 List 去重,则可以用 Collection 的 frequency 方法。
按拼音排序

List list = new ArrayList<>(Arrays.asList(“翁”, “啊”, “好”, “月”));
Log.d(TAG, "before sort: " + list);
Collections.sort(list, Collator.getInstance(Locale.SIMPLIFIED_CHINESE));

View相关
ViewFlipper,实现多个view的切换(循环),可自定义动画效果,且可针对单个切换指定动画,如中奖信息的展示。别人关于ViewFlipper使用的教程
view的isShown方法,只有当view本身以及它的所有祖先们都是visible时,isShown()才返回TRUE
android:clipChildren:是否限制子View在其范围内,神奇的属性
通过View.getDrawingCache()可以获取截图,但是需要setDrawingCacheEnabled(true)频繁使用可能会oom,还有一种方法直接用canvasBitmap bm = Bitmap.createBitmap((int) (w * scale), (int) (h*scale), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(); canvas.setBitmap(bm);View.draw(canvas);return bm;
ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);用于根据一个起始颜色值和一个结束颜色值以及一个偏移量生成一个新的颜色,分分钟实现类似于微信底部栏滑动颜色渐变。
android:duplicateParentState=“true”,让子View跟随其Parent的状态,如pressed等
setError(CharSequence error,Drawable icon)用于验证用户输入,通常用在EditText中。
includeFontPadding=“false”,TextView默认上下是有一定的padding的,有时候我们可能不需要上下这部分留白,加上它即可。
TextView.setCompoundDrawablePadding,代码设置TextView的drawable padding。
TextView类中的setTransformationMethod(TransformationMethod)方法,可用来实现“显示密码”,“显示大写"功能
runOnUiThread和 view.post都是直接回到主线程的方法,不用写handler,可用来刷新ui相关操作。
android:descendantFocusability,ListView的item中CheckBox等元素抢焦点导致item点击事件无法响应时,除了给对应的元素设置 focusable,更简单的是在item根布局加上android:descendantFocusability=“blocksDescendants”
View类中的三个方法:callOnClick(),performClick(),performLongClick(),用于触发View的点击事件;
复写Activity的onUserLeaveHint方法,确保用户离开界面时能立即暂停界面的一些任务
View类中的getLocationInWindow(int[])方法和getLocationOnScreen(int[])方法,获取View在窗口/屏幕中的位置
View类中的setSelected(boolean)方法结合android:state_selected=”"用来实现图片选中效果
StaticLayout是android中处理文字换行的一个工具类,StaticLayout已经实现了文本绘制换行处理,一般只有在自定义View时遇到长串文字需要换行时用到

public void onDraw(Canvas canvas){
super.onDraw(canvas);
TextPaint tp = new TextPaint();
tp.setColor(Color.BLUE);
tp.setStyle(Style.FILL);
tp.setTextSize(50);
String message = “这里是一个long long long long long long long long long long long long long text,自己看着换行显示吧,哈 哈”;
StaticLayout myStaticLayout = new StaticLayout(message, tp, canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
myStaticLayout.draw(canvas);
canvas.restore();
}

generateViewId 动态生成控件idmy_view.setId(View.generateViewId());
把一个view保存为Bitmap,正常情况下用第一种方法就可以了,但是如果是ScrollView,则必须采用第二种方法

public Bitmap createViewBitmap(View v) {
Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
v.draw(canvas);
return bitmap;
}

public static Bitmap getBitmapByView(ScrollView scrollView) {
int h = 0;
Bitmap bitmap = null;
// 获取scrollview实际高度
for (int i = 0; i < scrollView.getChildCount(); i++) {
h += scrollView.getChildAt(i).getHeight();
scrollView.getChildAt(i).setBackgroundColor(
Color.parseColor("#ffffff"));
}
// 创建对应大小的bitmap
bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,
Bitmap.Config.RGB_565);
final Canvas canvas = new Canvas(bitmap);
scrollView.draw(canvas);
return bitmap;
}

tools标签可以很好的帮助开发者实时预览xml的效果,并且运行以后tools标签的内容不会展示出来.例如

AndroidManifest.xml
oom有一种偷懒又有效的解决办法,在manifest上加android:largeHeap=“true”
给Activity标签设置了android:excludeFromRecents="true"属性后,退出程序后,长按home,该Activity不会在最近的任务列表中显示
资源
-nodpi——在没有特别定义的情况下,很多修饰符(-mdpi,-hdpi,-xdpi等等)都会默认自动缩放 assets/dimensions,有时候我们需要保持显示一致,这种情况下就可以使用 -nodpi。
Merge此标签可以在另一个布局文件中包含别的布局文件,而不用再新建一个 ViewGroup,对于自定义 ViewGroup 的时候也需要用到;可以通过载入一个带有标签的布局文件来自动定义它的子部件。
组件相关
startActivities(android.content.Intent)) 常用于在应用程序中间启动其他的Activity.
Activity.recreate ()强制让 Activity 重建。
ActivityOptions 负责Activity跳转时的动画

ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, 0, 0,
view.getWidth(), view.getHeight());
startActivity(new Intent(MainActivity.this, AnimationActivity.class),
opts.toBundle());

Fragment.setArguments—给 Fragment传参
fragment嵌套内部fragment的manager通过getChildFragmentManager()获得
DisplayMetrics来获取屏幕高度和宽度,此外,还可以通过它获取屏幕密度

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
//DisplayMetrics{density=3.0, width=1080, height=1920, scaledDensity=3.0, xdpi=428.625, ydpi=427.789}

Resources.getSystem().getDisplayMetrics().density可以不用 Context 也能获取屏幕密度哦
Fragment类中
当使用add()+show(),hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调onStop()等生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged()
show(),hide()最终是让Fragment的View setVisibility(true还是false),不会调用生命周期;
使用FragmentPagerAdapter+ViewPager时,切换回上一个Fragment页面时(已经初始化完毕),不会回调任何生命周期方法以及onHiddenChanged(),只有setUserVisibleHint(boolean isVisibleToUser)会被回调,所以如果你想进行一些懒加载,需要在这里处理。
其它
Messenger,AIDL 实现的封装,比手写 AIDL 更方便。
SparseArray Map的高效优化版本。推荐了解姐妹类SparseBooleanArray、SparseIntArray和SparseLongArray
ActivityManager.getMemoryClass ()通过这个方法可以知道系统还能给APP分配多少内存使用。
SystemClock.sleep (long)用这个方法可以很方便的模拟网络延迟,而且不会抛出InterruptedException
UrlQuerySanitizer一个很方便用来处理url链接的工具类

///取name值
UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(“http://xxx.com/?name=d”);
sanitizer.setAllowUnregisteredParamaters(true);
String name = sanitizer.getValue(“name”);

样式
为你的app添加默认布局样式,比如:每一个控件都需要写width和height属性,然而很多的控件的宽高属性都是wrap_content,那么我们可以通过在style文件添加如下样式,控件的宽高默认都是wrap_content样式啦

Gradle
versionNameSuffix 可以让你在基于不同构建类型的 manifest 中修改版本名这个属性,例如,如果需要在在 debug 版本中以”-SNAPSHOT”结尾,那么就可以轻松的看出当前是 debug 版还是 release 版
版本
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

git rm -r --cached .
git add .
git commit -m ‘update .gitignore’

本地生成的git库要提交remote时,pull报fatal: refusing to merge unrelated historiesgit pull origin master --allow-unrelated-histories

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android小部件开发是一种在Android应用程序中创建可直接在主屏幕上显示的交互式组件的方法。它允许用户通过简单地查看主屏幕即可获得应用程序的相关信息或访问其常用功能,而不必打开整个应用程序。 Android小部件可以是静态的,只能显示信息,例如时钟或天气预报,也可以是动态的,可以与用户进行实时交互,例如音乐播放器或电子邮件小部件。 要开发Android小部件,首先需要创建一个小部件类,继承自Android的AppWidgetProvider类。然后,需要在AndroidManifest.xml文件中进行相应的声明,以使系统能够正确加载和处理小部件。 接下来,需要定义小部件的布局和样式,以及处理小部件的交互逻辑。可以使用XML布局文件来定义小部件的外观与布局,还可以使用Java代码来处理用户与小部件的交互,例如点击事件或滑动手势。 在开发过程中,还可以利用Android提供的各种小部件组件,例如文本视图、按钮或进度条,来构建小部件的界面和功能。 最后,需要在小部件类中实现一些生命周期方法,例如onUpdate()、onEnabled()和onDisabled(),以便处理小部件的更新和启用/禁用状态。 Android小部件开发具有广泛的应用场景,可以用于显示实时数据、控制设备、提供快捷操作等。通过灵活运用小部件的设计和开发技巧,可以为用户提供更便捷、直观的体验,并提升应用程序的功能性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值