当前位置:   article > 正文

【android开发中的小技巧-1】_android xml string 引用

android xml string 引用
  1. 如果需要考虑应用的国际化,或者灵活。则建议将控件的内容,android:text=""属性值设置为 引用字符串资源(@string/uname)。而不是直接赋值:“用户名”

    如果觉得手动创建字符串麻烦,可以先写 android:text=“注册” 然后在"注册"这个字符串上 [Ctrl+1] ,选择提取安卓字符串(Extract android string)

     提取后,会自动在 strings.xml文件中 添加字符串子项,且布局文件中也会引用该字符串。最后 project->clean :就会发现黄色警告消失!
    
    • 1
  2. 同一个布局中存在多个按钮,系统会默认为 按钮栏,但是仍然会显示成普通按钮:

    -----对此eclipse会发出警告:Buttons in button bars should be borderless use style=“?android:attr/buttonBarButtonStyle” (and ?an…;

     因此需要设置按钮的 style="?Android:attr/buttonBarButtonStyle"。从而实现真正的 [无边界的按钮栏] 	
    
    • 1
  3. 安卓程序中: 1.由于目前安卓使用java开发,因此可以沿用java的一些字符串处理验证的逻辑。

     	        2.也可以使用android提供的 TextUtils类,进行一些字符串的处理。例如:TextUtils.isEmpty(userName);判断用户名是否为空
    
    • 1

4.[在程序中可能经常会用到 XXXActivity.this 来代表当前Activity对象的引用。为了简化代码可以:

	 	 1.先定义一个 private Context thisContext ; // 成员变量

	 	 2.在 onCreate 方法中 对它进行初始化: thisContext = this; //赋值  ,这样就方便了。

	 	 			    	//MainActivity.this
	例如:Toast.makeText(thisContext, "登录成功!\n 欢迎"+userName+"!", Toast.LENGTH_SHORT).show();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

]

  1. 有时如果需要 定义一个类,并定义一些方法。则可以直接写:

    UserInfoUtils.saveUserInfo(userName,pwd);
    
    在报错的地方,Ctrl+F1 然后选择创建类,创建方法
    
    • 1
    • 2
    • 3

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 】
  • 1
  1. xml布局文件中:长度建议用dp(设备无关像素) ,字体大小建议用(sp) 因为sp可以调整字体大小。

  2. ----------------【在逻辑代码中获取控件的资源文件的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	】
    
    • 1
    • 2
    • 3
    • 4
    • 5

    //小贴士:
    imgView.setBackgroundResource(0); //可以去掉背景图

  3. 获得手机屏幕的宽高(分辨率) :(方式一)

      获取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();  // 两个函数已经过时!,但最好用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    获得手机屏幕的宽高(分辨率):(方式二) ---------------【推荐使用】-----------

     DisplayMetrics dm = new DisplayMetrics();//屏幕度量
     getWindowManager().getDefaultDisplay().getMetrics(dm);
     screen_width = dm.widthPixels;//宽度
     screen_height = dm.heightPixels ;//高度
    
    • 1
    • 2
    • 3
    • 4

  4. -----【改变项目(app)的包名】----

    【在android工程上,右键–》android Tools —>Rename Application Package 】

  5. -----------【去除标题栏 与 状态栏(全屏)】------------------

    // 【这两行代码必须写在 setContentView();前面】

    //去除title   
    requestWindowFeature(Window.FEATURE_NO_TITLE);   
    
    //去掉Activity上面的状态栏---【也就会全屏】
    getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN);  
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意:
    全屏状态下,只要Activit重写了onCreateOptionsMenu();方法,则也可以实现 点击选项键弹出Dialog

    附录:【去掉app中所有页面的标题栏】:在清单文件中,application结点下 设置 android:theme属性为:@android:style/Theme.NoTitleBar
    则整个app的每一个Activity都会去掉标题栏。

    也可以单独设置去掉某个Activity的标题栏只需在 activity结点下设置 android:theme属性为:@android:style/Theme.NoTitleBar即可	
    
    • 1
  6. ---------------【设置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标签设置好屏幕方向】---设置后就无需再逻辑代码中设置强制横(竖)屏
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

14.1 :【 判断当前手机屏幕是横屏还是竖屏,可以用WindowManager获取手机屏幕宽高,然后判断如果 width>height 则为横屏,反之…】

14.2:【安卓模拟器设置横屏竖屏 】

	打开模拟器后 :ctrl + F12 即可切换
  • 1
  1. xml布局文件设计界面,顶部有一个下拉列表,可以选择Activity的状态,是横屏还是竖屏。

    且当设置Activity状态为 横屏后,原来的坐标原点也会变化,因此无需担心坐标问题

  2. ImgViewListener 实现 View.OnTouchListener

          -----【TouchListener的捕获优先级更高,且可以处理的事件类型较多,【因此使用这个】】
    注意:      
    	style="?android:attr/buttonStyleSmall"  此属性不能少否则 ImageView不能 产生触摸离开事件】 
    
    	例:	
             <ImageView
        		android:id="@+id/right_ImgView"
    	    	style="?android:attr/buttonStyleSmall" />	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  3. 遇到异常 :在项目中使用并映入 java.awt.Rectangle类后,编译正常,但运行时抛出:

    		java.lang.NoClassDefFoundError: java.awt.Rectangle
    
    
    原因:Android 底层不支持 java.awt 与,Swing,因此即使编译通过,但运行时会报错		
    
    • 1
    • 2
    • 3
    • 4

    解决办法:1.使用Android提供的碰撞检测API 或者自己编写碰撞检测逻辑

      2.查看JDK的Rectangle源码,把构造方法与 intersects(MyRectangle r) 提取到我的 MyRectangle工具类中。--经检测正常可用    		    	
    
    • 1
  4. /**
     * 本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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  5. 在编辑器左侧的边框上:右键:add Task 可以添加任务。 方便提醒下次需要做的工作,如:明天需要实现某个功能 】

  6. 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等控件的适配器	】	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  7. 【ListView的内存优化 :】—
    —————————————————————————————————————【前言】————————————————————————————————————————————————————————————————————
    * [屏幕上每显示出一个Item,则getView()就会被调用一次。]–即设置该Item的View。
    * 因此当用户滚动ListView时,就会不断的调用getView();展示Item。—因此不能每调用一次getView就创建View对象。
    *
    * 【解决方案1】:当被遮住的Item与新出来的Item使用的属于同一种View时,即可使用
    * 可以返回:convertView 即:曾经使用过的view对象作为新展示的view的对象 。实现View的复用。–节约内存
    *
    * 【解决方案2】 :当新显示出来的Item与旧的Item不同时,则可以用考虑使用单例模式。----实现不产生相同的重复View对象
    ————————————————————————————————————————————————————————————————————————————————————————————————————————————————

    1. 数据适配器的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;
    
    	}	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  8. 【优化二】:xml文件中:【ListView控件的[高度]最好设置为确定数值,或者match_parent ,更利于系统计算能够展示的条目数】

  9. 【实际上对于使用Adapter时,都建议使用convetView 参数 做内存优化】

  10. 对于已经创建的项目,可以通过在清单文件中,改minsdk属性,实现安卓应用向下兼容。

  11. 可以通过context的 getResource()方法获取项目中res下所有的 资源文件。

    例:获取Drawable类型的 图片资源文件对象:context.getResources().getDrawable(R.drawable.news1);
    
    • 1
  12. 利用:【 View.inflate(context, resource, root) ; 动态加载布局文件,返回View对象 】

    						//上下文, 需要被加载的布局文件id, root: ViewGroup ,用于包裹需要被加载的布局文件
    	view = View.inflate(mainActivity,R.layout.news_item, null); //动态加载一个布局文件,构成为一个View对象
    
    • 1
    • 2
  13. 然后 获取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());
    	....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  14. 【为ListView设置Item的单击事件】

        news_lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
    		@Override 			
    		public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
    			......
    		}
    	});
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  15. 【 android:padding=“10dp” 则整个控件或布局控件,的上下左右外边距都为10dp 】

  16. 清单文件中,android :versionName =“V1.0”; //代表此应用程序的版本

  17. 碰撞检测问题

    在项目中使用并映入 java.awt.Rectangle类后,编译正常,但运行时抛出:

    			java.lang.NoClassDefFoundError: java.awt.Rectangle
    
    
    	原因:Android 底层不支持 java.awt 与,Swing,因此即使编译通过,但运行时会报错		
    
    • 1
    • 2
    • 3
    • 4

    解决办法一:使用安卓自带的 Rect类,它直接提供了intersects方法,可以用于碰撞检测

    解决办法二: 查看JDK的Rectangle源码,把构造方法与 intersects(MyRectangle r) 提取到我的 MyRectangle工具类中。
    –经检测正常可用

    解决办法三:自己编写碰撞检测API							
    
    • 1

  18. 在安卓开发以及大部分的图形界面系统中,都有规定:

    1.不能在主线程中访问网络或其他耗时操作。 -----【如果在主UI线程中访问网络会造成UI卡顿,影响用户体验】
    
    2.不能在子线程中操作主界面控件。		 -----【因为 谁 创建的UI就要由 谁 管理 】
    
    
    	否则 将分别抛出这两个异常:1.android.os.NetworkOnMainThreadException 
    					    	   2.android.view.ViewRoot$CalledFromWrongThreadException, Only .....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    因此对于: 需要从网络,或数据库…中获取数据然后展示到控件上,建议使用:【 子线程访问网络,然后利用handler通知更新控件】

  19. 可以考虑使用 ScrollView 嵌套 TextView 实现 TextView滚动显示多行数据

  20. 安卓开发中 不能在主线程中进行 网络操作与耗时操作(例如,大文件读写,数据库读写…),可能会造成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) ,延迟任务操作】
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

  1. 【 获取网络图片,展示在ImageView上:

    	in = url_Conn.getInputStream();
    	BitMap = BitMapFactory.decodeInputStream(in);	//将输入流中的数据,编码成 Bitmap
    
    	//获得BitMap后
    	imgView1.setImageBitmap(bitMap);	//然后设置此bitmap为ImageView的内容图片
    
    • 1
    • 2
    • 3
    • 4
    • 5


  1. 注意:资源文件名 只能包含小写字母(a-z),数字(0-9),下划线( _ ),点(.) ,首字符不能为数字,否则系统产生资源ID时会出错
    ————————————————————————————————————————————————————————————————————————————————————————————

  2. 当程序中需要可能使用 多个Message对象时,不需要每次都创建Message对象

    因为获取Message对象的最好方法是调用 【Message.obtain()或者Handler.obtainMessage(), 】
    
    这样是从一个可回收对象池中获取Message对象。------可以减少内存开销
    
    • 1
    • 2
    • 3

————————————————————————————————————————————————————————————————————————————————————————————

  1. 【从电脑端输入多行数据到模拟手机或真机】

    [ 首先选中手机中需要输入信息的文本框
    
      然后 :adb shell 
           进入 shell后 : input text 填需要输进手机的文本 。就可以从电脑端输入多行数据到 安卓模拟器或真机中。
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
  2. 【安卓定时器的几种实现方式:

    1.使用Handler--msg 和Thread(线程)实现定时器,在thread里面sleep()计时
    2.handler.postDelayed(r, delayMillis) ,延迟任务操作
    3.timer.schedule(task, delay)
    
    • 1
    • 2
    • 3

  3. eclipse导入 安卓项目时,最好是 勾选 copy to worksapce ,
    【但是如果本 workspace中有同名的project,则会导入失败,且项目文件也会损坏。】

    因此建议先删除本workspace下的同名project,然后再 import --》copy to workspace								
    
    • 1

date : 2016-10-45


  1. 【LinearLayout 特有属性: android showDividers 属性 】

    <LinearLayout>标签的android:showDividers属性可以在LinearLayout的相应位置显示分隔线。
    
    android:showDividers属性可以设置如下4个值:
    
    	none:不显示分隔线;
    	beginning:在LinearLayout的开始处显示分隔线;
    	end:在Linearlayout的结尾处显示分隔线;
    	middle:在LinearLayout中的每两个组件间显示分隔线;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

  1. 内部类或者匿名类如果可以定义成 static 则建议定义成 static 。从而防止内存泄漏!

    因为非静态的内部类或者匿名类默认会持有一个 外部类的引用。使用方式为:外部类名.this
    因此如果内部类中不需要使用外部类的 实例变量 或 实例方法。则建议定义成静态的!

例:Handler 对象就建议定义成 static 的。

否则,由于Handler机制独立于Activity或Service,因此当Activity或Service销毁后。Handler并不会被移除。
Handler不销毁,就会导致Activity也无法被回收,此时就很容易出现内存泄漏的问题。
  • 1
  • 2

  1. PhoneNumberFormattingTextWatcher

    对于11位手机号,自动添加空格需求,只要添加以下监听器就可以了,PhoneNumberFormattingTextWatcher 系统本身存在的一个类。

    mMobileEt.addTextChangedListener(new PhoneNumberFormattingTextWatcher(Locale.CHINA.getCountry()));

    http://android.xsoftlab.net/reference/android/telephony/PhoneNumberFormattingTextWatcher.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/126348
推荐阅读
相关标签
  

闽ICP备14008679号