首页 文章 精选 留言 我的

精选列表

搜索[android studio],共10000篇文章
优秀的个人博客,低调大师

Android -- DisplayMetrics

干货 DisplayMetrics dm = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(dm); screenWidth = dm.widthPixels; screenHeight = dm.heightPixels; density = dm.density; densityDpi = dm.densityDpi; scaledDensity = dm.scaledDensity; DisplayMetrics metrics = dm; Log.i("yydcdut", "metrics::density=" + metrics.density +", densityDpi="+metrics.densityDpi +", heightPixels="+metrics.heightPixels +", widthPixels="+metrics.widthPixels +", scaledDensity="+metrics.scaledDensity +", xdpi="+metrics.xdpi +", ydpi="+metrics.ydpi); Log打印出来: metrics::density=1.5, densityDpi=240, heightPixels=854, widthPixels=480, scaledDensity=1.5, xdpi=239.05882, ydpi=243.72585 metrics.widthPixels 屏幕宽 metrics.heightPixels 屏幕高 metrics.density 屏幕密度 构造函数 DisplayMetrics 不需要传递任何参数;调用 getWindowManager() 之后,会取得 现有 Activity 的 Handle ,此时,getDefaultDisplay() 方法将取得的宽高维度存放于 DisplayMetrics 对象中,而取得的宽高维度是以像素为单位(Pixel) ,“像素”所指的是“绝对像素” 而非“相对像素”。 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4254599.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- ActivityLifeCycleCallbacks

ActivityLifeCycleCallbacks Application通过此接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理。 为什么用ActivityLifecycleCallbacks 以往若需监测Activity的生命周期事件代码,你可能是这样做的,重写每一个Acivity的onResume(),然后作统计和处理: @Override protected void onResume() { super.onResume(); //TODO 处理和统计代码 Log.v(TAG, "onResume"); Logger.v(TAG, "onResume"); Logging.v(TAG, "onResume"); //... } ActivityLifecycleCallbacks接口回调可以简化这一繁琐过程,在一个类中作统一处理。 ActivityLifecycleCallbacks怎么用? 在自定义的Application中的onCreate()方法,或在Application的无参构造方法内,调用Application.registerActivityLifecycleCallbacks()方法,并实现ActivityLifecycleCallbacks接口: public void onCreate() { super.onCreate(); this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityStopped(Activity activity) { Logger.v(activity, "onActivityStopped"); } @Override public void onActivityStarted(Activity activity) { Logger.v(activity, "onActivityStarted"); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { Logger.v(activity, "onActivitySaveInstanceState"); } @Override public void onActivityResumed(Activity activity) { Logger.v(activity, "onActivityResumed"); } @Override public void onActivityPaused(Activity activity) { Logger.v(activity, "onActivityPaused"); } @Override public void onActivityDestroyed(Activity activity) { Logger.v(activity, "onActivityDestroyed"); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { Logger.v(activity, "onActivityCreated"); } }); }; Log: V/OneActivity: onActivityCreated V/OneActivity: onActivityStarted V/OneActivity: onActivityResumed V/OneActivity: onActivityPaused V/MainActivity: onActivityCreated V/MainActivity: onActivityStarted V/MainActivity: onActivityResumed V/OneActivity: onActivityStopped V/OneActivity: onActivityDestroyed V/MainActivity: onActivityPaused V/MainActivity: onActivityStopped V/MainActivity: onActivityDestroyed 注意 ActivityLifeCycleCallbacks在API>=14上才可以调用。 兼容API<14 自己写一个ActivityLifeCycleCallbacks接口: public interface ActivityLifecycleCallbacks{ public void onActivityStopped(Activity activity); public void onActivityStarted(Activity activity); public void onActivitySaveInstanceState(Activity activity, Bundle outState); public void onActivityResumed(Activity activity); public void onActivityPaused(Activity activity); public void onActivityDestroyed(Activity activity); public void onActivityCreated(Activity activity, Bundle savedInstanceState); } 在Application中实现接口: public class MyApplication extends Application implements my.package.ActivityLifecycleCallbacks{ @Override public void onCreate() { super.onCreate(); } @Override public void onActivityStopped(Activity activity) { Log.i("Tracking Activity Stopped", activity.getLocalClassName()); } @Override public void onActivityStarted(Activity activity) { Log.i("Tracking Activity Started", activity.getLocalClassName()); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { Log.i("Tracking Activity SaveInstanceState", activity.getLocalClassName()); } @Override public void onActivityResumed(Activity activity) { Log.i("Tracking Activity Resumed", activity.getLocalClassName()); } @Override public void onActivityPaused(Activity activity) { Log.i("Tracking Activity Paused", activity.getLocalClassName()); } @Override public void onActivityDestroyed(Activity activity) { Log.i("Tracking Activity Destroyed", activity.getLocalClassName()); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { Log.i("Tracking Activity Created", activity.getLocalClassName()); } } 写基类: public class BaseActivity extends Activity { protected MyApplication nMyApplication; protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); nMyApplication = (MyApplication) getApplication(); nMyApplication.onActivityCreated(this, savedInstanceState); } protected void onResume() { // TODO Auto-generated method stub nMyApplication.onActivityResumed(this); super.onResume(); } @Override protected void onPause() { // TODO Auto-generated method stub nMyApplication.onActivityPaused(this); super.onPause(); } @Override protected void onDestroy() { // TODO Auto-generated method stub nMyApplication.onActivityDestroyed(this); super.onDestroy(); } @Override protected void onStart() { nMyApplication.onActivityStarted(this); super.onStart(); } @Override protected void onStop() { nMyApplication.onActivityStopped(this); super.onStop(); } @Override protected void onSaveInstanceState(Bundle outState) { nMyApplication.onActivitySaveInstanceState(this, outState); super.onSaveInstanceState(outState); } } 所有的类集成这个基类: public class MainActivity extends BaseActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4945990.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- setWillNotDraw()

干货 处理onDraw()方法不被执行的解决方法: setWillNotDraw(false); 官方文档的解释: If this view doesn't do any drawing on its own, set this flag to allow further optimizations. By default, this flag is not set on View, but could be set on some View subclasses such as ViewGroup. Typically, if you overrideonDraw(Canvas)you should clear this flag. 用法 public class LayoutLayout extends LinearLayout { public LayoutLayout (Context context, intposition) { super(context); setWillNotDraw(false); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } } } 总结 设置view是否更改,如果用自定义的view,重写ondraw()应该将调用此方法设置为false,这样程序会调用自定义的布局。 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4190008.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- MeasureSpec

自定义控件都会去重写View的onMeasure方法,因为该方法指定该控件在屏幕上的大小。 protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) onMeasure传入的两个参数是由上一层控件传入的大小,有多种情况,重写该方法时需要对计算控件的实际大小,然后调用setMeasuredDimension(int, int)设置实际大小。 onMeasure传入的widthMeasureSpec和heightMeasureSpec不是一般的尺寸数值,而是将模式和尺寸组合在一起的数值。 常用的三个函数 int getMode(int measureSpec)//根据提供的测量值(格式)提取模式(上述三个模式之一) int getSize(int measureSpec)//根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小) int makeMeasureSpec(int size,int mode)//根据提供的大小值和模式创建一个测量值(格式) 得到模式: int mode = MeasureSpec.getMode(widthMeasureSpec) 得到尺寸: int size = MeasureSpec.getSize(widthMeasureSpec) Mode mode共有三种情况,取值分别为 MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。 MeasureSpec.AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。 MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。 Code 控件根据横竖屏、屏幕大小自适应: @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); if (0 == mRatioWidth || 0 == mRatioHeight) { setMeasuredDimension(width, height); } else { if (width < height * mRatioWidth / mRatioHeight) { setMeasuredDimension(width, width * mRatioHeight / mRatioWidth); } else { setMeasuredDimension(height * mRatioWidth / mRatioHeight, height); } } } public void fitWindow(int width, int height) { if (width < 0 || height < 0) { throw new IllegalArgumentException("Size cannot be negative."); } mRatioWidth = width;//屏幕宽 mRatioHeight = height;//屏幕高 requestLayout();//促使调用onMeasure } 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4170629.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- CursorAdapter

CursorAdapter CursorAdapter继承于BaseAdapter,它是个虚类,它为cursor和ListView提供了连接的桥梁。 public abstract class CursorAdapter extends BaseAdapter 注意cursor的必须要有个命名为"_id"的列。比如Contacts._ID就为"_id" 必须实现以下函数: abstract View newView(Context context, Cursor cursor, ViewGroup parent) abstract void bindView(View view, Context context, Cursor cursor) newView该函数第一次回调用后,如果数据增加后也会再调用,但是重绘是不会调用的。 数据增加后,回调用该函数来生成与新增数据相对应的view。 bindView函数第一次回调用后,如果数据更新也会再调用,但重绘会再次调用的。 总的来说应该是在调用bindView如果发现view为空会先调用newView来生成view。 Code public class MySqliteOpenhelper extends SQLiteOpenHelper { public MySqliteOpenhelper(Context context, int version) { super(context, "dianhuaben.db", null, version); } @Override public void onCreate(SQLiteDatabase db) {//注意:使用CursorAdapter时,创建表必须有以_id为列名的列 String sql = "CREATE TABLE dhb (_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),phone VARCHAR(20))"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } public void createCursorAdapter(Cursor cursor) { //游标适配器,构造方法,传入cursor mAdapter = new CursorAdapter(this, cursor) {//重写两个方法 @Override public View newView(Context context, Cursor cursor, ViewGroup parent) {//找到布局和控件 ViewHolder holder = new ViewHolder(); LayoutInflater inflater = getLayoutInflater(); View inflate = inflater.inflate(R.layout.listview_item, null); holder.item_tv_name = (TextView) inflate.findViewById(R.id.item_tv_name); holder.item_tv_phone = (TextView) inflate.findViewById(R.id.item_tv_phone); inflate.setTag(holder); return inflate;//返回的view传给bindView。 } @Override public void bindView(View view, Context context, Cursor cursor) { // 把数据设置到界面上 ViewHolder holder = (ViewHolder) view.getTag(); String name = cursor.getString(cursor.getColumnIndex("name")); String phone = cursor.getString(cursor.getColumnIndex("phone")); holder.item_tv_name.setText(name); holder.item_tv_phone.setText(phone); } }; }; SimpleCursorAdapter 简单提及一下 public void createSimpleCursorAdapter(Cursor cursor) {// SimpleCursorAdapter继承了CursorAdapter继承了BaseAdapter String[] from = {TABLE_NAME_NAME,TABLE_NAME_PHONE};//列名与控件id一一对应 int[] to = {R.id.item_tv_name,R.id.item_tv_phone}; //用的是SimpleCursorAdapter,用法和simpleAdapter相似 mAdapter = new SimpleCursorAdapter(MainActivity.this, R.layout.listview_item, cursor, from, to); } 使用SimpleCursorAdapter,时,创建表必须有以_id为列名的列 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4090723.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册