Android - 简易开发点记录
1.Color用int时 可以使用
1 | Color.parseColor( "#FFB452" ) |
2.底部滑动布局自定义,可以使用 (来自于 https://x-sir.blog.csdn.net/article/details/65938389?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control)
PopupWindow
3.手机亮度调整(来自于 https://x-sir.blog.csdn.net/article/details/65938389?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /** * 设置手机屏幕亮度变暗 */ public static void lightoff(Activity activity) { WindowManager.LayoutParams lp = activity.getWindow().getAttributes(); lp.alpha = 0 .3f; activity.getWindow().setAttributes(lp); } /** * 设置手机屏幕亮度显示正常 */ public static void lighton(Activity activity) { WindowManager.LayoutParams lp = activity.getWindow().getAttributes(); lp.alpha = 1f; activity.getWindow().setAttributes(lp); } |
4.随机生成viewid:
1 | generateViewId() |
5.在一个activity中动态生成Fragment:动态生成时,传递一些数据,比如数据显示为什么,控件是否可读,都可以;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public void addOneItem(XXXInfosBean infosBean) { int id = generateViewId(); LinearLayout linearLayout = (LinearLayout) LayoutInflater.from( this ).inflate(R.layout.item_layer, llRoot, false ); linearLayout.setId(id); llRoot.addView(linearLayout); PatrolEditInfoItemFragment fragment = new PatrolEditInfoItemFragment(); fragment.isReader = true ; fragment.xXXInfosBean = infosBean; FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.add(id, fragment, "FragmentItem" + id); transaction.commit(); } // 删除fragment,当前Fragment上的删除按钮的响应事件,将当前的Fragment传递,remove即可 public void deleteFragment(Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.remove(fragment); transaction.commit(); } |
6.动态生成View
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // 将xxx列表 动态添加在UI上 for ( int i = 1 ; i < xxLists.size(); i++) { addXXUI(xxLists.get(i), xxLists.size(), i); } public void addXXUI(String str, int size, int index) { LayoutInflater inflater = LayoutInflater.from( this ); // 获取需要被添加控件的布局 // 获取需要添加的布局 R.layout.item_xx是布局文件名称,R.id.xx_item是布局中的根布局 LinearLayout layout = (LinearLayout) inflater.inflate( R.layout.item_xx, null ).findViewById(R.id.xx_item); TextView tvXX = layout.findViewById(R.id.tv_xx); tvXX.setText(str); if ((index + 1 ) == size) { // 最后一个分割线不显示,因为每一个布局底部都有一个分割线,但是最后一个的分割线应该不显示,所以判断一下,如果是最后一个则隐藏 View vXXSplit = layout.findViewById(R.id.v_xx_spilt); vXXSplit.setVisibility(View.GONE); } // 将布局加入到当前布局中(llXXList 是当前activity里的LinearLayout) llXXList.addView(layout); } |
7. activity之间intent跳转传参 object
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Intent intent = new Intent(XXXActivity. this , XXXXXXActivity. class ); // xxxBean 一个对象实例 intent.putExtra( "xxxBean" , xxxBean); startActivity(intent); // 接收的Activity xxxxxResBean = (XXXBean)getIntent().getSerializableExtra( "xxxBean" ); /* *对应的Bean里 需要implements Serializable * Bean里的子类里也需要 implements Serializable * 否则会报错java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = xxx.xxx.xxx.XXXXBean) */ |
8.页面的标题栏,通用,使用一个xml,可以将所有的使用的按钮都放置在这里,默认都隐藏,在对应的页面显示即可
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 36 37 38 39 40 41 42 43 | 在布局文件中引入<include layout= "@layout/common_title" /> <?xml version= "1.0" encoding= "utf-8" ?> <RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:id= "@+id/rl_title" android:layout_height= "wrap_content" android:background= "@color/ui_dark_color" > <LinearLayout android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:gravity= "center_vertical" android:paddingLeft= "@dimen/dp_6" > <RelativeLayout android:id= "@+id/rl_back" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:paddingBottom= "@dimen/dp_15" android:paddingTop= "@dimen/dp_15" android:paddingEnd= "@dimen/dp_10" > <ImageView android:layout_width= "@dimen/dp_25" android:layout_height= "@dimen/dp_25" android:src= "@mipmap/back" /> </RelativeLayout> <TextView android:id= "@+id/tv_title" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_marginLeft= "@dimen/dp_15" android:text= "@string/title" android:textColor= "#ffffffff" android:textSize= "@dimen/sp_18" /> </LinearLayout> <RelativeLayout ..../> </RelativeLayout> |
9. 限制屏幕截屏
1 2 | // 限制屏幕截屏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); |
10. float 保留两位小数
1 | ( new DecimalFormat( ".00" )).format(v) |
11. MPChart 自定义 label与value的相对位置(来源于 https://blog.csdn.net/daio_odai/article/details/88570066 做了一点修改)
// 修改源码 PieChartRenderer 类中的 drawValues 方法 // 因为label过长,放在饼图内显示会重叠,故放在饼图外部, // 但是文本过长还是会有重叠的部分 // 所以修改 if (j < data.getEntryCount() && entryLabel != null) { // drawEntryLabel(c, entryLabel, labelPtx, labelPty + lineHeight); /* * 修改 让label 与 value 显示在 一行 * */ // drawEntryLabel(c, entryLabel, labelPtx - 50 , labelPty ); /* * 修改 让label 与 value 显示在 别行 * */ // drawEntryLabel(c, entryLabel, labelPtx, labelPty - lineHeight ); // 获取字符串的长度 x 减去 System.out.println("绘图 饼图 x " + entryLabel + " " + labelPtx + "\n" + " 修改后 " + (labelPtx + (mEntryLabelsPaint.measureText(value +"%") / 2) - (mEntryLabelsPaint.measureText(entryLabel) / 2))); if (!(labelPtxOne > 0)) { labelPtxOne = labelPtx; drawEntryLabel(c, entryLabel, labelPtx + (mEntryLabelsPaint.measureText(value +"%") / 2) - (mEntryLabelsPaint.measureText(entryLabel) / 2), labelPty - lineHeight ); } else if (labelPtx < labelPtxOne / 2){ drawEntryLabel(c, entryLabel, labelPtx + (mEntryLabelsPaint.measureText(value +"%") / 2) + (mEntryLabelsPaint.measureText(entryLabel) / 2), labelPty - lineHeight ); } else { drawEntryLabel(c, entryLabel, labelPtx + (mEntryLabelsPaint.measureText(value +"%") / 2) - (mEntryLabelsPaint.measureText(entryLabel) / 2), labelPty - lineHeight ); } }
12. ImageView 加载网络图片 使用 gilde
1 2 3 4 5 6 7 8 9 10 | //implementation 'com.github.bumptech.glide:glide:4.1.1' RequestOptions options = new RequestOptions(); options.centerCrop() .placeholder(me.iwf.photopicker.R.drawable.__picker_xxx) .error(me.iwf.photopicker.R.drawable.__picker_xx_broken); Glide.with( this ) .load(Uri.parse( "http://xx/xx/xxxxxx.png" )) .apply(options) .thumbnail( 0 .1f) .into(ivImage); |
13. 限制一行显示
1 2 3 4 | // maxLines 限制最大高度,此处无用,随便写的 lines 文本行数 ellipsize省略号显示位置 android:maxLines= "5" android:lines= "1" android:ellipsize= "end" |
14.判断某activity是否处于栈顶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /** * * 判断某activity是否处于栈顶 * @return true在栈顶 false不在栈顶 */ public static boolean isTop(Class cls, Context context){ ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); String name = manager.getRunningTasks( 1 ).get( 0 ).topActivity.getClassName(); return name.equals(cls.getName()); } //使用 if (XXXUtils.isTop(XXXXActivity. class ,MyApplication.getAppContext())) { ... } |
14.监听anrdoid屏幕方向(找了很多,都没有效果,最后找到了一个非常好的 https://blog.csdn.net/h3c4lenovo/article/details/43197759)
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | // activity 声明 public OrientationEventListener mScreenOrientationEventListener; this .mScreenOrientationEventListener = new OrientationEventListener( this ) { @Override public void onOrientationChanged( int i) { // i的范围是0~359 // 屏幕左边在顶部的时候 i = 90; 右旋转 90 // 屏幕顶部在底部的时候 i = 180; 倒置 // 屏幕右边在底部的时候 i = 270; 左旋转 90 // 正常情况默认i = 0; 默认 if ( 45 <= i && i < 135 ) { orientationType = 90 ; } else if ( 135 <= i && i < 225 ) { orientationType = 180 ; } else if ( 225 <= i && i < 315 ) { orientationType = 270 ; } else { orientationType = 0 ; } } }; mScreenOrientationEventListener.enable(); @Override protected void onPostResume() { super .onPostResume(); if ( null == mScreenOrientationEventListener) { mScreenOrientationEventListener.enable(); } } @Override protected void onPause() { super .onPause(); if ( null != mScreenOrientationEventListener) { mScreenOrientationEventListener.disable(); } } @Override protected void onDestroy() { super .onDestroy(); if ( null != mScreenOrientationEventListener) { mScreenOrientationEventListener.disable(); } ... } |
15.通过指定包名和页面,调用第三方APP
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 | // requestCode 11 resultCode 999 数值自定义 private void startThreeActivity() { String packageName = "xxx.xxx.xxx" ; String activity = "xxx.xxx.xxx.xxx.XXXActivity" ; ComponentName component = new ComponentName(packageName, activity); Intent intent = new Intent(); intent.setComponent(component); intent.putExtra( "xxx" , "xxxxxx" ); startActivityForResult(intent, 11 ); } // 获取第三方返回的数据 @Override protected void onActivityResult( int requestCode, int resultCode, Intent data) { super .onActivityResult(requestCode, resultCode, data); if (requestCode == 11 && resultCode == 999 ) { String text = data.getStringExtra( "xxx" ); } } // 第三方APP: 返回数据时,setResult Intent intent = new Intent(); intent.putExtra( "xxx" , xxxxxxx); setResult( 999 , intent); finish(); //结束当前的activity的生命周期 // 第三方指定activity 需 android:exported="true" (AndroidManifest.xml) |
16.更新UI(有时候更新UI无效,可以使用 runOnUiThread )
1 2 3 4 5 6 7 | runOnUiThread( new Runnable() { @Override public void run() { // 更新UI ... } }); |
17.数据实时通知更新eventbus
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // implementation 'org.greenrobot:eventbus:3.0.0' // 注册 if (!EventBus.getDefault().isRegistered( this )) { EventBus.getDefault().register( this ); } @Subscribe (threadMode = ThreadMode.MAIN) public void Event(XXX xxx) { LogUtil.i( "aaa" , " 测试刷新列表" ); ... } // 需要更新数据时调用 EventBus.getDefault().post( new XXX()); |
18.Activity 穿透多个Activity传值
1 2 3 4 5 6 7 8 | startActivityForResult(intent, requestCode); //中间使用 setResult(resultCode, intent); // 第一个参数表示结果返回码,一般只要大于1就可以 finish() // 最后根据onActivityResult requestCode resultCode获取 // 或者使用 FLAG_ACTIVITY_FORWARD_RESULT intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); startActivity(intent); |
19.motionEvent.getPointerCount()的值一直为1
1 2 3 4 5 6 7 8 | // 在onTouch监听方法中,ACTION_DOWN需返回true public boolean onTouch(View view, MotionEvent motionEvent) { .... if (motionEvent.getAction() == MotionEvent.ACTION_DOWN){ return true ; } return false ; } |
20.垂直方向上移动View的位置
1 | xxx.setTranslationY(getResources().getDimensionPixelSize(R.dimen.xxx)); |
21. 含有EditText的activity 进入时会直接弹出软键盘,在EditText的父布局中添加
1 2 | android:focusable= "true" android:focusableInTouchMode= "true" |
22.国际化时,因为不是全语种翻译导致 values\strings.xml中会有红线警告,虽然不影响运行,但是加上如下 tools:ignore 就可以不警告了
1 | <resources tools:ignore= "MissingTranslation" xmlns:tools= "http://schemas.android.com/tools" > |
23. android studio Unable to open debugger port
1 2 3 | xxx>adb kill-server xxx>adb start-server |
会持续更新,主要是自己看的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具