赞
踩
如果需要考虑应用的国际化,或者灵活。则建议将控件的内容,android:text=""属性值设置为 引用字符串资源(@string/uname)。而不是直接赋值:“用户名”
如果觉得手动创建字符串麻烦,可以先写 android:text=“注册” 然后在"注册"这个字符串上 [Ctrl+1] ,选择提取安卓字符串(Extract android string)
提取后,会自动在 strings.xml文件中 添加字符串子项,且布局文件中也会引用该字符串。最后 project->clean :就会发现黄色警告消失!
同一个布局中存在多个按钮,系统会默认为 按钮栏,但是仍然会显示成普通按钮:
-----对此eclipse会发出警告:Buttons in button bars should be borderless use style=“?android:attr/buttonBarButtonStyle” (and ?an…;
因此需要设置按钮的 style="?Android:attr/buttonBarButtonStyle"。从而实现真正的 [无边界的按钮栏]
安卓程序中: 1.由于目前安卓使用java开发,因此可以沿用java的一些字符串处理验证的逻辑。
2.也可以使用android提供的 TextUtils类,进行一些字符串的处理。例如:TextUtils.isEmpty(userName);判断用户名是否为空
4.[在程序中可能经常会用到 XXXActivity.this 来代表当前Activity对象的引用。为了简化代码可以:
1.先定义一个 private Context thisContext ; // 成员变量
2.在 onCreate 方法中 对它进行初始化: thisContext = this; //赋值 ,这样就方便了。
//MainActivity.this
例如:Toast.makeText(thisContext, "登录成功!\n 欢迎"+userName+"!", Toast.LENGTH_SHORT).show();
]
有时如果需要 定义一个类,并定义一些方法。则可以直接写:
UserInfoUtils.saveUserInfo(userName,pwd);
在报错的地方,Ctrl+F1 然后选择创建类,创建方法
6.【每一个应用程序都应该在ROM中有一个私有目录 :(data/data/packagename/files)】
获取(使用)方式有两种:
1.
context.getFileDir().getPath(); // 或得当前应用的私有目录(data/data/packagename/files)的(路径)–ROM 中
//context 如:MainActivity.this 。
2.
context.openFileIn(Out)put(name,mode) —获得当前应用的私有目录(data/data/packagename/files)的 文件输入/输出流】
//【context 可以是 Activity.this ,Service.this 】
xml布局文件中:长度建议用dp(设备无关像素) ,字体大小建议用(sp) 因为sp可以调整字体大小。
----------------【在逻辑代码中获取控件的资源文件的id】---------------
例:imgView.setBackgroundResource(R.drawable.j); //【设置它的背景图】
imgView.setTag(R.drawable.j); //【 设置ImageView的 Tag标志信息 为 ImageView的 图片资源id 】
//在其他代码中就可以 :通过 img.getTag();来获取前期用 Tag 保存的 资源文件id
int userClickImgBG_id = (Integer) imgView.getTag(); //【获得ImageView 的图片资源文件的id 】
//小贴士:
imgView.setBackgroundResource(0); //可以去掉背景图
获得手机屏幕的宽高(分辨率) :(方式一)
获取WindowManager有两种方式:1: WindowManager wm = this.getSystemService(WINDOW_SERVICE);
2: WindowManager wm = this.getWindowManager();
Display display = this.getWindowManager().getDefaultDisplay(); //获得默认(本地)的显示设备
screen_width = display.getWidth();
screen_width = display.getHeight(); // 两个函数已经过时!,但最好用
获得手机屏幕的宽高(分辨率):(方式二) ---------------【推荐使用】-----------
DisplayMetrics dm = new DisplayMetrics();//屏幕度量
getWindowManager().getDefaultDisplay().getMetrics(dm);
screen_width = dm.widthPixels;//宽度
screen_height = dm.heightPixels ;//高度
】
-----【改变项目(app)的包名】----
【在android工程上,右键–》android Tools —>Rename Application Package 】
-----------【去除标题栏 与 状态栏(全屏)】------------------
// 【这两行代码必须写在 setContentView();前面】
//去除title
requestWindowFeature(Window.FEATURE_NO_TITLE);
//去掉Activity上面的状态栏---【也就会全屏】
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN);
注意:
全屏状态下,只要Activit重写了onCreateOptionsMenu();方法,则也可以实现 点击选项键弹出Dialog
附录:【去掉app中所有页面的标题栏】:在清单文件中,application结点下 设置 android:theme属性为:@android:style/Theme.NoTitleBar
则整个app的每一个Activity都会去掉标题栏。
也可以单独设置去掉某个Activity的标题栏只需在 activity结点下设置 android:theme属性为:@android:style/Theme.NoTitleBar即可
---------------【设置Activity屏幕 强制横屏,或强制 竖屏:】--------------------
【由于横竖屏切换会导致Activity销毁,然后重新创建。应对方法有三种:
方式1.【在onCreate方法中 强制为横屏或竖屏】---详见下文------------[但并不推荐] 方式2.【在清单文件中设置Activity的屏幕方向属性为强制横屏或竖屏】---详见下文---------[不够灵活] 方式3.【在清单文件中为Activity属性 android:configChanges="orientation|keyboardHidden|screenSize"】-----【最佳方式】 1.【AndroidManifest.xml文件中设置Activity的屏幕方向属性为强制横屏或竖屏】 <activity android:name=".MainActivity" android:screenOrientation="landscape/[portrait]"/> 2.【onCreate方法中 强制为横屏或竖屏】 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //ActivityInfo.SCREEN_ORIENTATION_PORTRAIT 为竖屏 【因此最好是在AndroidManifest.xml 文件中,为Activity标签设置好屏幕方向】---设置后就无需再逻辑代码中设置强制横(竖)屏
14.1 :【 判断当前手机屏幕是横屏还是竖屏,可以用WindowManager获取手机屏幕宽高,然后判断如果 width>height 则为横屏,反之…】
14.2:【安卓模拟器设置横屏竖屏 】
打开模拟器后 :ctrl + F12 即可切换
xml布局文件设计界面,顶部有一个下拉列表,可以选择Activity的状态,是横屏还是竖屏。
且当设置Activity状态为 横屏后,原来的坐标原点也会变化,因此无需担心坐标问题
ImgViewListener 实现 View.OnTouchListener
-----【TouchListener的捕获优先级更高,且可以处理的事件类型较多,【因此使用这个】】
注意:
style="?android:attr/buttonStyleSmall" 此属性不能少否则 ImageView不能 产生触摸离开事件】
例:
<ImageView
android:id="@+id/right_ImgView"
style="?android:attr/buttonStyleSmall" />
遇到异常 :在项目中使用并映入 java.awt.Rectangle类后,编译正常,但运行时抛出:
java.lang.NoClassDefFoundError: java.awt.Rectangle
原因:Android 底层不支持 java.awt 与,Swing,因此即使编译通过,但运行时会报错
解决办法:1.使用Android提供的碰撞检测API 或者自己编写碰撞检测逻辑
2.查看JDK的Rectangle源码,把构造方法与 intersects(MyRectangle r) 提取到我的 MyRectangle工具类中。--经检测正常可用
/** * 本Activity被覆盖后,调用onPuse() --> onStop(); * * 如果系统不需要内存则短时间内不会销毁,此Activity. * * 如果发现仍然没有被销毁,则可以重写 reStart()方法,在那里面finish */ @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); this.finish(); } // 重新启动本Activity时调用 @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); this.finish(); }
在编辑器左侧的边框上:右键:add Task 可以添加任务。 方便提醒下次需要做的工作,如:明天需要实现某个功能 】
Adapter常用的实现类 介绍:
1,ArrayAdapter:简单,易用的Adapter,可用于将数组或List集合多个值包装成多个列表项。
2,SimpleAdapter:并不简单,功能强大的Adapter,【集合中的每一个map对象代表一个 Item数据】----适合复杂的Item展示
//from : 子元素map中的key ,to : 要展示到的控件id
//例:HashMap<String, Object> row = new HashMap<String, Object>(); //一个map对象代表一个 Item数据
3.SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据库查询集---比如通讯录数据,数据库数据
4,【BaseAdapter:通常用于被扩张。扩展BaseAdapter可以对个列表项进行最大限度的定制。】----[公司常用]
【比如:可以做 ListView ,Spinner ,GridView ,Gallery等控件的适配器 】
【ListView的内存优化 :】—
—————————————————————————————————————【前言】————————————————————————————————————————————————————————————————————
* [屏幕上每显示出一个Item,则getView()就会被调用一次。]–即设置该Item的View。
* 因此当用户滚动ListView时,就会不断的调用getView();展示Item。—因此不能每调用一次getView就创建View对象。
*
* 【解决方案1】:当被遮住的Item与新出来的Item使用的属于同一种View时,即可使用
* 可以返回:convertView 即:曾经使用过的view对象作为新展示的view的对象 。实现View的复用。–节约内存
*
* 【解决方案2】 :当新显示出来的Item与旧的Item不同时,则可以用考虑使用单例模式。----实现不产生相同的重复View对象
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
数据适配器的getView()方法会传进来一个convertView,convertView是指曾经使用过的view对象,可以被重复使用,但是在使用前需要判断是否为空,
不为空直接复用,并作为getview方法的返回对象。
【注意:convertView是已经使用过的Item,因此如果Item比较高,则需要计算好一个屏幕下能显示多少条目Item,
且当position大于 beans.getSize()-1才复用convertView 否则,有时直接复用convertView可能导致有些Item永远都不能被显示出来】 __________________________________________________________________________________________ @Override public View getView(int position, View convertView, ViewGroup parent) { /** * 【方案一:】 * 日后使用ListView 都可以考虑用这个作为ListView内存优化的模板代码 */ TextView view = null; if(convertView != null){ //判断converView是否为空,不为空则 复用 view = (TextView) convertView; }else{ view = new TextView(mContext);//创建一个textView对象 } return view; }
【优化二】:xml文件中:【ListView控件的[高度]最好设置为确定数值,或者match_parent ,更利于系统计算能够展示的条目数】
【实际上对于使用Adapter时,都建议使用convetView 参数 做内存优化】
对于已经创建的项目,可以通过在清单文件中,改minsdk属性,实现安卓应用向下兼容。
可以通过context的 getResource()方法获取项目中res下所有的 资源文件。
例:获取Drawable类型的 图片资源文件对象:context.getResources().getDrawable(R.drawable.news1);
利用:【 View.inflate(context, resource, root) ; 动态加载布局文件,返回View对象 】
//上下文, 需要被加载的布局文件id, root: ViewGroup ,用于包裹需要被加载的布局文件
view = View.inflate(mainActivity,R.layout.news_item, null); //动态加载一个布局文件,构成为一个View对象
然后 获取view中的每一个子控件对象,并设置子控件的内容 :可以用 【 view.findViewById(int resid); 获取子控件对象 】
例:
//获得控件对象
ImageView icon_ImgView = (ImageView)view.findViewById(R.id.item_img_icon);
...
//设置子控件内容
newsBean = newsList.get(position);
icon_ImgView.setBackground(newsBean.getNewsIconImg());
....
【为ListView设置Item的单击事件】
news_lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
......
}
});
【 android:padding=“10dp” 则整个控件或布局控件,的上下左右外边距都为10dp 】
清单文件中,android :versionName =“V1.0”; //代表此应用程序的版本
碰撞检测问题
在项目中使用并映入 java.awt.Rectangle类后,编译正常,但运行时抛出:
java.lang.NoClassDefFoundError: java.awt.Rectangle
原因:Android 底层不支持 java.awt 与,Swing,因此即使编译通过,但运行时会报错
解决办法一:使用安卓自带的 Rect类,它直接提供了intersects方法,可以用于碰撞检测
解决办法二: 查看JDK的Rectangle源码,把构造方法与 intersects(MyRectangle r) 提取到我的 MyRectangle工具类中。
–经检测正常可用
解决办法三:自己编写碰撞检测API
在安卓开发以及大部分的图形界面系统中,都有规定:
1.不能在主线程中访问网络或其他耗时操作。 -----【如果在主UI线程中访问网络会造成UI卡顿,影响用户体验】
2.不能在子线程中操作主界面控件。 -----【因为 谁 创建的UI就要由 谁 管理 】
否则 将分别抛出这两个异常:1.android.os.NetworkOnMainThreadException
2.android.view.ViewRoot$CalledFromWrongThreadException, Only .....
因此对于: 需要从网络,或数据库…中获取数据然后展示到控件上,建议使用:【 子线程访问网络,然后利用handler通知更新控件】
可以考虑使用 ScrollView 嵌套 TextView 实现 TextView滚动显示多行数据
安卓开发中 不能在主线程中进行 网络操作与耗时操作(例如,大文件读写,数据库读写…),可能会造成UI卡顿
因此: 【如果需要在控件上显示网络,或数据库,磁盘大文件 的数据,常用 子线程+handler--Message 来实现 】
-----子线程获取数据,handler通知更新 :msg.object 成员可以携带数据,或者用 msg.what】
注1:【除了用 Handler --- Message解决外,还可以在子线程中使用 activity.runOnUiThread(Runnable)
把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给activity.runOnUiThread(Runnable)】
----实现在子线程中写代码但运行在主线程中,因此不会报错】
注2:【 还可以用 handler.post(Runnable); 也是把代码写在runnable,但发送到主线程中运行】
注3: 【利用: handler.postDelayed(r, delayMillis) ,延迟任务操作】
【 获取网络图片,展示在ImageView上:
in = url_Conn.getInputStream();
BitMap = BitMapFactory.decodeInputStream(in); //将输入流中的数据,编码成 Bitmap
//获得BitMap后
imgView1.setImageBitmap(bitMap); //然后设置此bitmap为ImageView的内容图片
】
注意:资源文件名 只能包含小写字母(a-z),数字(0-9),下划线( _ ),点(.) ,首字符不能为数字,否则系统产生资源ID时会出错
————————————————————————————————————————————————————————————————————————————————————————————
当程序中需要可能使用 多个Message对象时,不需要每次都创建Message对象
因为获取Message对象的最好方法是调用 【Message.obtain()或者Handler.obtainMessage(), 】
这样是从一个可回收对象池中获取Message对象。------可以减少内存开销
————————————————————————————————————————————————————————————————————————————————————————————
【从电脑端输入多行数据到模拟手机或真机】
[ 首先选中手机中需要输入信息的文本框
然后 :adb shell
进入 shell后 : input text 填需要输进手机的文本 。就可以从电脑端输入多行数据到 安卓模拟器或真机中。
]
【安卓定时器的几种实现方式:
1.使用Handler--msg 和Thread(线程)实现定时器,在thread里面sleep()计时
2.handler.postDelayed(r, delayMillis) ,延迟任务操作
3.timer.schedule(task, delay)
】
eclipse导入 安卓项目时,最好是 勾选 copy to worksapce ,
【但是如果本 workspace中有同名的project,则会导入失败,且项目文件也会损坏。】
因此建议先删除本workspace下的同名project,然后再 import --》copy to workspace
date : 2016-10-45
【LinearLayout 特有属性: android showDividers 属性 】
<LinearLayout>标签的android:showDividers属性可以在LinearLayout的相应位置显示分隔线。
android:showDividers属性可以设置如下4个值:
none:不显示分隔线;
beginning:在LinearLayout的开始处显示分隔线;
end:在Linearlayout的结尾处显示分隔线;
middle:在LinearLayout中的每两个组件间显示分隔线;
内部类或者匿名类如果可以定义成 static 则建议定义成 static 。从而防止内存泄漏!
因为非静态的内部类或者匿名类默认会持有一个 外部类的引用。使用方式为:外部类名.this
因此如果内部类中不需要使用外部类的 实例变量 或 实例方法。则建议定义成静态的!
例:Handler 对象就建议定义成 static 的。
否则,由于Handler机制独立于Activity或Service,因此当Activity或Service销毁后。Handler并不会被移除。
Handler不销毁,就会导致Activity也无法被回收,此时就很容易出现内存泄漏的问题。
PhoneNumberFormattingTextWatcher
对于11位手机号,自动添加空格需求,只要添加以下监听器就可以了,PhoneNumberFormattingTextWatcher 系统本身存在的一个类。
mMobileEt.addTextChangedListener(new PhoneNumberFormattingTextWatcher(Locale.CHINA.getCountry()));
http://android.xsoftlab.net/reference/android/telephony/PhoneNumberFormattingTextWatcher.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。