开发中的小知识点汇总(持续更新)
2018-02-08 11:48
267 查看
设置Dialog从底部弹出:
——————————————————————————————————————————————
隐式启动来分享:
——————————————————————————————————————————————
调用系统浏览器
——————————————————————————————————————————————
65535问题:
Moudle下的build.gradle中defaultConfig节点下添加:
dependencies节点下添加:
最后MyApplication中添加:
——————————————————————————————————————————————
再按一次退出应用的提示:
——————————————————————————————————————————————
7.0安装apk:
——————————————————————————————————————————————
根据Uri获取图片的路径
——————————————————————————————————————————————
6.0权限用户拒绝后进入设置页面:
——————————————————————————————————————————————
打开手电筒:
权限:
——————————————————————————————————————————————
设置TextView超过多少字后显示省略号
关于网上最多的结果就是这样的:
比如上面的这个,我想实现“”乌鲁…“”经过测试发现,不是绝对的准确,这个与字体大小以及宽度等等也有一定的关系,我感觉最好的方法就是确定好字体大小和想预留几个汉字,最后进行适当的调试。
——————————————————————————————————————————————
自定义TabLayout字体大小:
先自定义一个style
然后引用即可:
——————————————————————————————————————————————
检测手机的通知和状态栏是否开启允许通知,不然推送了消息也不显示:
检测某个Service是否正在运行:
第二个参数:Service包名路径
——————————————————————————————————————————————
底部导航栏总是被输入框顶上去,很烦!有时在manifest中设置属性windowSoftInputMode然并卵,可以在代码中setContentView之前设置:
——————————————————————————————————————————————
动态代码设置shape颜色:
先设置样式,solid颜色为透明。
布局里background引用此样式,最后动态设置颜色即可:
——————————————————————————————————————————————
遍历Map
——————————————————————————————————————————————
密码框设置密码显示或者隐藏:
————————————————————————————————————————————
打开手机拨号页面和通讯录页面,别忘了先获取权限
——————————————————————————————————————————————————————————
1、获取系统当前时间(以年月日为例):yyyy-MM-dd对应格式:2017-01-01,根据需求自己改变格式
——————————————————————————————————————————————————
设置EditText软键盘显示搜索按钮,自动弹出软键盘:
——————————————————————————————————————————————————
1、设置EdiText的光标的颜色以及大小:
添加属性:
自定义一个光标color_cursor:
————————————————————————————————————————————————————————————
2、让EditText默认事先失去焦点,不让光标闪动:
找到EditText的父控件设置:
———————————————————————————————————————————————————————————
3、ListView设置空View:
—————————————————————————————————————————————————————————
4、强制所有页面竖屏:
可以在你的基类里添加:
——————————————————————————————————————————————————————————
5、TextView设置下划线:
——————————————————————————————————————————————————————————
7.系统AlertDialog设置按钮字体颜色大小(非自定义Dialog):
——————————————————————————————————————————————————————————
8.SpannableString设置String给TextView分段显示不同的颜色:
————————————————————————————————————————————————————————————
9、Android系统为了跟IOS不一样,当界面OverScroll的时候会显示一个阴影。为了达到更好的显示效果,最好禁用系统的overScrollMode,如根布局添加android:overScrollMode=”never”
————————————————————————————————————————————————————————————
10、关于字节byte、进制以及IP的转换问题
———————————————————————————————————————————————————————————
12、ListView定位问题:
当打开列表的其中一项,然后返回时 需要定位到之前滚动到的位置
———————————————————————————————————————————————————————————
13、ListView点击item中的子控件,需获取当前点击item的position:有些容易获取,直接用getView()中的position就行,有些就不行,比如item中有Spinner控件,如何判断是点击的那个item中的Spinner呢
itemPosition就跟列表中的position对应。
———————————————————————————————————————————————————————————
13、Home键的监听:
“`
//设置Dialog从窗体底部弹出 Window dialogWindow = dialog.getWindow(); dialogWindow.setGravity(Gravity.BOTTOM); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); dialogWindow.setAttributes(lp);
——————————————————————————————————————————————
隐式启动来分享:
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_TEXT, "镜花水月"); shareIntent.setType("text/plain"); startActivity(shareIntent);
——————————————————————————————————————————————
调用系统浏览器
Uri uri = Uri.parse("http://www.baidu.com"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
——————————————————————————————————————————————
65535问题:
Moudle下的build.gradle中defaultConfig节点下添加:
multiDexEnabled true
dependencies节点下添加:
compile 'com.android.support:multidex:1.0.1'
最后MyApplication中添加:
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
——————————————————————————————————————————————
再按一次退出应用的提示:
/** * 捕捉返回事件按钮并判断的两次点击事件的时间差 * */ private long exitTime = 0; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0){ if(System.currentTimeMillis()-exitTime>2000){ Toast.makeText(MainActivity.this,"再按一次退出应用",Toast.LENGTH_SHORT).show(); exitTime=System.currentTimeMillis(); }else{ finish(); } return true; } return super.onKeyDown(keyCode, event); }
——————————————————————————————————————————————
7.0安装apk:
private void installApk(File file) { Intent intent = new Intent(Intent.ACTION_VIEW); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Uri contentUri = FileProvider.getUriForFile(this, "包名.fileprovider", file); intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); } else { intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } startActivity(intent); }
——————————————————————————————————————————————
根据Uri获取图片的路径
private String getPicPath(Uri selectedImage) throws Exception { Cursor cursor = this.getContentResolver().query(selectedImage, (String[])null, (String)null, (String[])null, (String)null); String picturePath; if(cursor != null) { cursor.moveToFirst(); int file = cursor.getColumnIndex("_data"); picturePath = cursor.getString(file); cursor.close(); cursor = null; } else { File file1 = new File(selectedImage.getPath()); picturePath = file1.getAbsolutePath(); } return picturePath; }
——————————————————————————————————————————————
6.0权限用户拒绝后进入设置页面:
Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", getPackageName(), null)); startActivity(intent);
——————————————————————————————————————————————
打开手电筒:
private TextView tv_flashLight;//控制按钮(默认显示:打开) private Camera camera; private Camera.Parameters parameters; ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},0);//动态获取权限 //点击事件 tv_flashLight.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { camera = Camera.open(); parameters = camera.getParameters(); if (tv_flashLight.getText().toString().equals("打开")){ tv_flashLight.setText("关闭"); parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); }else { tv_flashLight.setText("打开"); parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); } camera.setParameters(parameters); } });
权限:
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-feature android:name="android.hardware.camera"/> <uses-feature android:name="android.hardware.camera.autofocus"/>
——————————————————————————————————————————————
设置TextView超过多少字后显示省略号
关于网上最多的结果就是这样的:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:maxLines="1" android:ellipsize="end" android:maxEms="4" android:paddingLeft="20dp" android:text="乌鲁木齐" />
比如上面的这个,我想实现“”乌鲁…“”经过测试发现,不是绝对的准确,这个与字体大小以及宽度等等也有一定的关系,我感觉最好的方法就是确定好字体大小和想预留几个汉字,最后进行适当的调试。
——————————————————————————————————————————————
自定义TabLayout字体大小:
先自定义一个style
<style name="MyTabStyle" parent="TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"> <item name="android:textSize">16sp</item> <item name="android:textAllCaps">true</item> </style>
然后引用即可:
app:tabTextAppearance="@style/MyTabStyle"
——————————————————————————————————————————————
检测手机的通知和状态栏是否开启允许通知,不然推送了消息也不显示:
private boolean isNotificationEnabled(Context context) { String CHECK_OP_NO_THROW = "checkOpNoThrow"; String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION"; AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); ApplicationInfo appInfo = context.getApplicationInfo(); String pkg = context.getApplicationContext().getPackageName(); int uid = appInfo.uid; Class appOpsClass = null; /* Context.APP_OPS_MANAGER */ try { appOpsClass = Class.forName(AppOpsManager.class.getName()); Method checkOpNoThrowMethod = appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE, Integer.TYPE, String.class); Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION); int value = (Integer) opPostNotificationValue.get(Integer.class); return ((Integer) checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg) == AppOpsManager.MODE_ALLOWED); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return false; }
检测某个Service是否正在运行:
public static boolean isServiceExisted(Context context, String className) { ActivityManager activityManager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningServiceInfo> serviceList = activityManager .getRunningServices(Integer.MAX_VALUE); if (!(serviceList.size() > 0)) { return false; } for (int i = 0; i < serviceList.size(); i++) { ActivityManager.RunningServiceInfo serviceInfo = serviceList.get(i); ComponentName serviceName = serviceInfo.service; if (serviceName.getClassName().equals(className)) { return true; } } return false; }
第二个参数:Service包名路径
——————————————————————————————————————————————
底部导航栏总是被输入框顶上去,很烦!有时在manifest中设置属性windowSoftInputMode然并卵,可以在代码中setContentView之前设置:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
——————————————————————————————————————————————
动态代码设置shape颜色:
先设置样式,solid颜色为透明。
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:bottomLeftRadius="5dp" android:topLeftRadius="5dp"/> <solid android:color="#00000000"/> </shape>
布局里background引用此样式,最后动态设置颜色即可:
GradientDrawable grad = (GradientDrawable)view.getBackground(); grad.setColor("颜色");
——————————————————————————————————————————————
遍历Map
StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : map.entrySet()) { sb.append(entry.getKey() + ":" + entry.getValue() + ","); } Log.e("-----sb",sb.toString());
——————————————————————————————————————————————
密码框设置密码显示或者隐藏:
if (isChecked) { // 显示 passwordEditText.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); showToast("显示"); } else { passwordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); showToast("隐藏"); }
————————————————————————————————————————————
打开手机拨号页面和通讯录页面,别忘了先获取权限
//拨号 Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL);//跳转到拨号界面,手机号自动填充 Uri data = Uri.parse("tel:" + number); intent.setData(data); startActivity(intent); //通讯录 Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); startActivityForResult(intent, OPEN_CONTACTS); 然后onActivityResult回调 @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == OPEN_CONTACTS) { try { JSONObject contactObj = ContactUtil.getContact(this, data.getData()); Log.e("==name:", contactObj.optString("username")); Log.e("==phone:", contactObj.optString("phoneNumber")); } catch (JSONException e) { e.printStackTrace(); } } }
——————————————————————————————————————————————————————————
1、获取系统当前时间(以年月日为例):yyyy-MM-dd对应格式:2017-01-01,根据需求自己改变格式
public String getDate() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(new Date()); }
——————————————————————————————————————————————————
设置EditText软键盘显示搜索按钮,自动弹出软键盘:
显示搜索按钮,xml的editText设置2行即可: android:imeOptions="actionSearch" android:singleLine="true" 设置EditText显示多行: android:layout_height="100dp"//设置一个固定高度 android:inputType="textMultiLine" android:gravity="top"//让输入内容从左上角开始 事件监听: searchText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if(actionId == EditorInfo.IME_ACTION_SEARCH) { SoftInputUtil.hideSoftInput(MainActivity.this, searchText); Log.e("==search",v.getText().toString()); } return true; } }); public class SoftInputUtil { public SoftInputUtil() { } public static void showSoftInput(Context context) { InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, 2); } public static void hideSoftInput(Context context, View view) { InputMethodManager immHide = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); immHide.hideSoftInputFromWindow(view.getWindowToken(), 0); } }
——————————————————————————————————————————————————
1、设置EdiText的光标的颜色以及大小:
添加属性:
android:textCursorDrawable="@drawable/color_cursor"
自定义一个光标color_cursor:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:width="1.5dp" /> <solid android:color="#7B3A94" /> </shape>
————————————————————————————————————————————————————————————
2、让EditText默认事先失去焦点,不让光标闪动:
找到EditText的父控件设置:
android:focusable="true" android:focusableInTouchMode="true"
———————————————————————————————————————————————————————————
3、ListView设置空View:
if(addressAdapter==null||addressAdapter.isEmpty()){ View empityView = View.inflate(this,R.layout.empty,null); ((ViewGroup) delivery_address_listView.getParent()).addView(empityView, delivery_address_listView.getLayoutParams()); delivery_address_listView.setEmptyView(empityView); }
—————————————————————————————————————————————————————————
4、强制所有页面竖屏:
可以在你的基类里添加:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
——————————————————————————————————————————————————————————
5、TextView设置下划线:
textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG ); textView.getPaint().setAntiAlias(true);
——————————————————————————————————————————————————————————
7.系统AlertDialog设置按钮字体颜色大小(非自定义Dialog):
private AlertDialog dialog; public void showDialog(View view){ dialog = new AlertDialog.Builder(this).create(); dialog.setMessage("确定要删除?"); dialog.setButton(AlertDialog.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this,"删除",Toast.LENGTH_SHORT).show(); } }); dialog.setButton(AlertDialog.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); dialog.show(); //注意:设置的这些属性(字体颜色、大小)都要在show之后,不然报空指针 Button btnPositive = dialog.getButton(AlertDialog.BUTTON_POSITIVE); Button btnNegative = dialog.getButton(AlertDialog.BUTTON_NEGATIVE); btnPositive.setTextColor(Color.parseColor("#7B3A94")); btnNegative.setTextColor(Color.parseColor("#7B3A94")); }
——————————————————————————————————————————————————————————
8.SpannableString设置String给TextView分段显示不同的颜色:
String price = "售价: ¥585"; 比如我想让前面的“售价:”显示的是黑色,后面的价格“¥585”显示的是红色 就可以在item中设置TextView的时候字体颜色先全部设置成红色 然后在adapter中绑定数据的时候设置 SpannableString ss_price= new SpannableString(price); ss_price.setSpan(new ForegroundColorSpan(Color.parseColor("#131313")),0,3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//设置文本的前景色 item.wine_selling_price.setText(ss_price);
————————————————————————————————————————————————————————————
9、Android系统为了跟IOS不一样,当界面OverScroll的时候会显示一个阴影。为了达到更好的显示效果,最好禁用系统的overScrollMode,如根布局添加android:overScrollMode=”never”
————————————————————————————————————————————————————————————
10、关于字节byte、进制以及IP的转换问题
/** * byte字节数组转换成16进制 */ public String toHexString(byte[] bytes) { BigInteger bigInteger = new BigInteger(1, bytes); return bigInteger.toString(16); } /** * 16进制转IP */ public String HEXToIp(String hex){ //要先将其转换成10进制long整型,再转换成ip; return longToIP(Long.parseLong(hex,16)); } /** * 10进制long类型整数,转换为 IP */ public String longToIP(long longIp) { StringBuffer sb = new StringBuffer(""); // 直接右移24位 sb.append(String.valueOf((longIp >>> 24))); sb.append("."); // 将高8位置0,然后右移16位 sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16)); sb.append("."); // 将高16位置0,然后右移8位 sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8)); sb.append("."); // 将高24位置0 sb.append(String.valueOf((longIp & 0x000000FF))); return sb.toString(); } /** * Ip 转换为 long类型 10 进制整数 */ public Long ipToLong(String ipString) { Long[] ip = new Long[4]; int pos1= ipString.indexOf("."); int pos2= ipString.indexOf(".",pos1+1); int pos3= ipString.indexOf(".",pos2+1); ip[0] = Long.parseLong(ipString.substring(0 , pos1)); ip[1] = Long.parseLong(ipString.substring(pos1+1 , pos2)); ip[2] = Long.parseLong(ipString.substring(pos2+1 , pos3)); ip[3] = Long.parseLong(ipString.substring(pos3+1)); return (ip[0]<<24)+(ip[1]<<16)+(ip[2]<<8)+ip[3]; } /** * 将16进制Id转换成10进制Id */ private String SixTeenToTen(String each_collecter) { String eachId = each_collecter.substring(0, 8); String a = eachId.substring(0, 2); String b = eachId.substring(2, 4); String c = eachId.substring(4, 6); String d = eachId.substring(6, 8); return String.valueOf(Integer.parseInt(a, 16) + Integer.parseInt(b, 16) * 256 + Integer.parseInt(c, 16) * 256 * 2 + Integer.parseInt(d, 16) * 256 * 3); }
———————————————————————————————————————————————————————————
12、ListView定位问题:
当打开列表的其中一项,然后返回时 需要定位到之前滚动到的位置
private int index; private int top; //在列表点击事件setOnItemClickListener里记录滚动到的位置 index = listView.getFirstVisiblePosition(); View v = listView.getChildAt(0); top = (v == null) ? 0 : v.getTop(); //当返回时,再恢复到原来的位置 listView.setSelectionFromTop(index, top);
———————————————————————————————————————————————————————————
13、ListView点击item中的子控件,需获取当前点击item的position:有些容易获取,直接用getView()中的position就行,有些就不行,比如item中有Spinner控件,如何判断是点击的那个item中的Spinner呢
在Adapter的getView()方法中绑定数据的地方设置Tag,item.spinner.setTag(position); 最后在子控件的点击事件setOnItemSelectedListener中再取出position就行了: itemPosition = (int) parent.getTag()
itemPosition就跟列表中的position对应。
———————————————————————————————————————————————————————————
13、Home键的监听:
@Override protected void onUserLeaveHint() { super.onUserLeaveHint(); Log.e("-----Home","应用进入后台"); }
“`
相关文章推荐
- iOS开发中遇到的小知识点汇总(持续更新)
- iOS开发已已错已忘知识点总结,持续更新中,,,
- Android 开发大坑汇总(持续更新)
- 开发不归路上遇到并解决的各种疑难杂症(持续汇总,不断更新)
- JAVA开发文章汇总,持续更新。
- Unity 编辑器开发 知识点 持续更新
- 微信小程序教程、开发资源下载汇总(2.8日更新,持续更新中……)
- 前端文档汇总(含代码规范、开发流程、知识分享,持续更新)
- C/C++重要知识点汇总(持续更新中)
- 软件测试/质量汇总知识点(持续更新)
- Android开发经典笔试面试题汇总(持续更新中)
- python开发中用到的知识点汇总---不断更新中
- C#.NET开发中常用的技术问题汇总(持续更新)
- [置顶] Android 开发问题汇总(持续更新)
- iOS开发常用小知识点(持续更新2018.3.13)
- 自己收藏的Android开发的知识点各种传送门 持续更新中~~
- 【学习路线】最新Java开发资料汇总(持续更新ing)
- cocos2d-x开发学习资源汇总(网站)持续更新中...
- 关于实际开发中优化web的一些小技巧汇总(持续更新中)