Android应用开发常用知识(3)
2016-06-14 15:18
447 查看
根据Intent获取包名
public static String getAppPackageByIntent(Context context, Intent intent) { if (context == null || intent == null) { return ""; } String pkgName = ""; try { PackageManager pm = context.getPackageManager(); ComponentName cn = intent.resolveActivity(pm); if (cn != null && pm != null) { pkgName = cn.getPackageName(); } } catch (Exception e) { e.printStackTrace(); } return pkgName; }
EditText获取焦点自动选中部分文本
EditText如果想实现获取焦点选中全部文本比较方便,用下面代码即可:mEditText.setSelectAllOnFocus(true);
如果想部分选中,用下面代码:
mEditTextCurName.setSelectAllOnFocus(true); mEditTextCurName.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { int start = 0; int stop = XXXX; mEditText.setSelection(start, stop); } } });
如果只设置setOnFocusChangeListener的话你会发现根本实现不了这个效果,通过看源码发现,在onTouchUp的时候做了某些处理,但如果setSelectAllOnFocus的话会规避这个问题。
Android监听home键消息
可以通过监听action为Intent.ACTION_CLOSE_SYSTEM_DIALOGS广播来实现取消隐藏键盘时的动画
如果我们的EditText正处于编辑状态,用下面的代码隐藏键盘时会有一个从上到下的动画:editText.clearFocus(); InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
如果去掉editText.clearFocus()则不会有动画。
http://stackoverflow.com/questions/38417054/hide-android-keyboard-without-animation
AlertDialog实现旋转屏幕不消失
在AndroidManifest activity中加入下面设置android:configChanges="keyboardHidden|orientation|screenSize"
Space控件
Space是Android 4.0中新增的一个控件,它可以用来分隔不同的控件,其中形成一个空白的区域。EditText 取消复制粘贴功能
mEditText.setCustomSelectionActionModeCallback(new NoAction()); public static class NoAction implements ActionMode.Callback { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; } @Override public void onDestroyActionMode(ActionMode mode) { } }
引用support库版本问题
项目中有时候会同时引用com.android.support:appcompat-v7和com.android.support:support-v13,这时候要保持版本的一致,否则可能会出现报错RelativeLayout 内容居中解决办法
使用Linearlayout本来利用父控件的gravity属性是很好解决的。但是对应RelativeLayout虽然有 gravity属性,但是如果你使用,你会发现实际他是不能生效的。解决办法:
在RelativeLayout的子空间里,使用以下3个属性就行了。
android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:layout_centerInParent="true"
gravity 一般是针对linearlayout会使用很方便。
分享
public static void share(Activity activity, String title, String url){ Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, activity.getString(R.string.share_page, title, url, getAppName())); activity.startActivity(Intent.createChooser(intent, activity.getString(R.string.text_share))); }
<string name="share_page">「%1$s」:%2$1s (来自 @%3$sApp) </string> <string name="text_share">分享</string>
获取应用名称,应用版本
public static String getAppName(){ if(sAppName == null){ PackageManager packageManager = null; ApplicationInfo applicationInfo = null; try { packageManager = mAppContext.getPackageManager(); applicationInfo = packageManager.getApplicationInfo(mAppContext.getPackageName(), 0); } catch (PackageManager.NameNotFoundException e) { applicationInfo = null; } sAppName = (String) packageManager.getApplicationLabel(applicationInfo); } return sAppName; } public static String getVersionName(){ if(sVerionName == null){ PackageManager packageManager = mAppContext.getPackageManager(); PackageInfo packageInfo = null; try { packageInfo = packageManager.getPackageInfo(mAppContext.getPackageName(), 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } if(packageInfo != null){ sVerionName = packageInfo.versionName; } } return sVerionName; }
Resources类中的getIdentifier(name, defType, defPackage)方法
根据资源名称获取其ID,比如我们想获取status bar高度,就可以采取下面的方法:Resources resources = mActivity.getResources(); int resourceId = resources.getIdentifier("status_bar_height", "dimen","android"); int height = resources.getDimensionPixelSize(resourceId);
TextView字体大小不随系统设置里面字体大小改变
通过TextView代码我们发现public void setTextSize(int unit, float size)里面是通过public static float applyDimension(int unit, float value, DisplayMetrics metrics) { switch (unit) { case COMPLEX_UNIT_PX: return value; case COMPLEX_UNIT_DIP: return value * metrics.density; case COMPLEX_UNIT_SP: return value * metrics.scaledDensity; case COMPLEX_UNIT_PT: return value * metrics.xdpi * (1.0f/72); case COMPLEX_UNIT_IN: return value * metrics.xdpi; case COMPLEX_UNIT_MM: return value * metrics.xdpi * (1.0f/25.4f); } return 0; }
来计算字体大小的,设置里面的字体大小改变的是metrics.scaledDensity,那么我们调用
setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) setTextSize(TypedValue.COMPLEX_UNIT_PT, textSize) setTextSize(TypedValue.COMPLEX_UNIT_IN, textSize) setTextSize(TypedValue.COMPLEX_UNIT_MM, textSize) setTextSize(float size) //sp
或者
android:textSize="16dp" android:textSize="16px"
等等,不用sp就可以了;
view.getHeight()=0的解决办法
原因是可能该View还没有进行measure,可以用下面的方法解决这个问题:int height = view.getHeight(); if (height == 0) { int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); view.measure(w, h); height = view.getMeasuredHeight(); }
或者
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mHeight = getMeasuredHeight(); mWidth = getMeasuredWidth(); } });
Intent.FLAG_ACTIVITY_NEW_TASK的使用
我们可能有这样的使用场景:应用调起其他应用的界面时,比如文件选择器,当我们此时home键回到桌面,再从桌面点击应用回来,还想停留在文件选择器界面时,就不要设置intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);,让两个
acitvity在相同的
task里面。
ImageView的android:stretchMode属性
stretchMode属性值的作用是设置GridView中的条目以什么缩放模式去填充剩余空间。参数stretchMode 可选值为:- none
- columnWidth
- spacingWidth
- spacingWidthUniform
在AndroidManifest中动态引用 applicationId
在 build.gradle 中配置:android { defaultConfig { applicationId "com.android.hq.example" ... } }
AndroidManifest.xml 中使用:
<intent-filter> <action android:name="${applicationId}.action.TEST" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
相关文章推荐
- Android 编程:calledfromWrongThreadException 的原因
- android studio中断开SVN连接,并彻底清理项目中的.svn文件
- Android studio 执行debug模式时一直报Socket closed
- Android 日期控件只显示年月
- ios 开发 观察 完整的Android应用开发概述
- (OK) Android 6.0 (Marshmallow) Install apk - INSTALL_FAILED_INVALID_URI
- Android 屏幕适配的一种方案
- Android语音识别开发详解(基于讯飞语音SDK)
- Android6.0权限分析
- View 的工作原理
- android:layout_weight的真实含义/android:layout_gravity的条件
- Android dex分包方案 (多dex)
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
- android开发(49) Android 下拉刷新的实现。使用 SwipeRefreshLayout 代替 pull-to-refesh
- 如何使用Android Studio开发/调试Android源码
- Android 开发之 下载 图片数据
- Layout_weight
- Android Button 实现 描边、颜色渐变、圆角等
- Android View事件分发机制及View的滑动冲突
- android关于异常退出的学习