Android学习笔记

1.RadioButton 去掉默认的圆圈样式:mButtonleft.setButtonDrawable(android.R.color.transparent);

    在xml内:android:button="@null";


2. 获取windowmager的方法:

   WindowManager m = (WindowManager) getView().getContext().getSystemService(getView().getContext().WINDOW_SERVICE);


3.如果view包含parent的情况下不能添加进去到布局里面,先获取view的parent再移除:

     ViewGroup g=(ViewGroup) v.getParent();	
     g.removeView(v);;  


4. 同一个view只能addview一次到布局里面,否则报已经有parent 的错误。


5. 用代码控制view 与其他view的距离

  View.setTranslationX //Sets the horizontal location of this view relative to its left position


6.设置背景为透明:颜色设置为#00000000;


7.measure只有View类中才有这个方法,也就是说所有的View,像LinearLayout、Button这些控件的measure方法都是从View继承的,onMeasure方法才是真正的测量控件大小的方法,是由View的子类实现的,onMeasure是在measure方法中调用的


8.栈内存一般用于存储基本类型数据以及对象的引用,堆内存一般存储对象的本体。栈的速度比较快,是快速存储。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。比如int a=3; 首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。记住只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。所以 String str = " abc" ;很有可能只是指向共享的数据而没有创建新对象,而已new String("abc");就一定会创建新对象,而且是在堆里面创建对象

使用String str = " abc" ;的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String(" abc" );的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担


9.当比较包装类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==。

 1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 
  他们之间的比较,应用双等号(==),比较的是他们的值。  

 2.复合数据类型(类) 
  当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。


10.退出时不把Activity杀死,下次进来还是会加载原来那个Activity而不会重新加载。

    

11.一键清理后静态变量会初始化。

   

12.Imageview 加载帧动画 

       

 imageView.setBackgroundResource(R.anim.frame);	  
		final AnimationDrawable mAnimation = (AnimationDrawable) imageView.getBackground();
		imageView.post(new Runnable() {
			@Override
			public void run() {
				mAnimation.start();


			}

        

  13.代码控制View之间的间距;

LinearLayout.LayoutParams p=new android.widget.LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		p.leftMargin=50;
		p.rightMargin=50;



14.RadioButton 设置layoutParam 使用radiogroup

RadioGroup.LayoutParams p=new android.widget.RadioGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

 15.获取屏幕大小的方法,得到一个屏幕尺寸的三种方法如下:

// 通过WindowManager获取

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);


// 通过Resources获取

DisplayMetrics dm2 = getResources().getDisplayMetrics();


// 获取屏幕的默认分辨率

Display display = getWindowManager().getDefaultDisplay();

System.out.println("width-display :" + display.getWidth());

System.out.println("heigth-display :" + display.getHeight());


得到一个屏幕尺寸的三种方法如下:

// 通过WindowManager获取

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);


// 通过Resources获取

DisplayMetrics dm2 = getResources().getDisplayMetrics();


// 获取屏幕的默认分辨率

Display display = getWindowManager().getDefaultDisplay();

System.out.println("width-display :" + display.getWidth());

System.out.println("heigth-display :" + display.getHeight());


在安卓4.2系统中,使用方法一得到了正确的屏幕尺寸值,而使用方法二和三得到的值全部为零。原因不祥。其中方法三中的display.getWidth()和display.getHeight()已被弃用。


DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);//display = getWindowManager().getDefaultDisplay(); display.getMetrics(dm)(把屏幕尺寸信息赋值给DisplayMetrics dm);

width = dm.widthPixels;

height = dm.heightPixels;

xdpi = dm.xdpi;

ydpi = dm.ydpi;

density = dm.densityDpi;

fdensity = dm.density;


查询log,得到各值如下:

D/Lichking(22643): -----------widthpixels---540

D/Lichking(22643): -----------heightpixels---960

D/Lichking(22643): -----------xdpi---244.92857

D/Lichking(22643): -----------ydpi---246.30302

D/Lichking(22643): -----------density---240

D/Lichking(22643): -----------fdensity---1.5

另提一点,我们通常所指的屏幕上的int尺寸是像素单位,比如我用getHitRect()得到控件的矩形坐标的值即使和像素尺寸相匹配的


DisplayMetrics和Display的关系。

Display指代显示区域这个对象,它可能是真实的物理屏幕,也可能仅指应用程序的显示区域,比如在非全屏Activity里,系统因为有状态栏,因此显示区域要比物理屏幕要小。DisplayMetrics里封装了显示区域的各种属性值。查看源码发现,在DisplayMetrics对各个属性值的注释都说明为真实的物理尺寸。而且也发现display.getMetrics(dm)这一函数基本在应用在获取真实屏幕尺寸的时候。记住这一点即好。


另外xdpi不是指屏幕宽度上以dp为单位的大小。以dp为单位的屏幕宽度需用计算公式:dpWidth = WidthPixels / fdensity = 540 / 1.5 = 360


16.shdaer:

Android中提供了Shader类专门用来渲染图像以及一些几何图形,Shader下面包括几个直接子类,分别是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 BitmapShader主要用来渲染图像,LinearGradient 用来进行梯度渲染,RadialGradient 用来进行环形渲染,SweepGradient 用来进行梯度渲染,ComposeShader则是一个 混合渲染,可以和其它几个子类组合起来使用。


17.WeakReference:弱引用,用于观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference 记住它,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。这时候可以使用 Weak Reference 这个类。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是使用一般的 reference。


18. Soft Reference:Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除,SoftReference 是用来设计 object-cache 之用的。如此一来 SoftReference 不但可以把对象 cache 起来(参考http://blog.csdn.net/yuzhiboyi/article/details/7775963)


19.Assert 断言是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误



20.textview.settextsize(float size), 源码可以看到,最终set进去设置的是px单位,它会将转为sp,所以使用时应该使用sp,转为px后set进去:

public void setTextSize(float size) {
        setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
    }

21.listview 的item去掉默认选中样式:

mListView.setSelector(new ColorDrawable(Color.TRANSPARENT));


22.Application单例问题,系统只会创建一个application,所以以下方式创建单例application是错误的,虽然获取context 不会报错,可是获取context的服务会出现空指针:

public static MyApplication getApplication(){
		if(mApplication==null){			
				mApplication=new MyApplication();				
		}
		return mApplication;
	}

应该这样使用:

</pre><pre name="code" class="java">    private static MyApplication mApplication;
    private int WINDOW_with;
    private int WINDOW_heigh;

	public static MyApplication getApplication(){		
		return mApplication;
	}
	
	 @Override
	public void onCreate() {
		
		super.onCreate();
		mApplication = this;
					
		}


23.Liteview item具有缓存机制,会缓存第一页的view,也就是说第一页的item是null,第二页不是null,因此可以利用holder来快速找打view,但是如果需要listview不同位置显示不一样的话就不可以利用缓存了,缓存机制应该是每个view都是一样的,只是数据不同,但是如果不同位置的view不一样的话就没法利用缓存,只能通过不断的创建view方式。



24.viewpaer的问题一般是出现在缓存问题上,特别要注意。


25.与动画使用放在一起的操作,优化方式有:通过动画监听,动画结束后才做相关操作。


26.relativelayout代码设置子view居中:

LayoutParams lp = new LayoutParams(MyApplication.getApplication().getWindowWith()/6, LayoutParams.WRAP_CONTENT);		
		layout.setLayoutParams(lp);	
		lp.addRule(RelativeLayout.CENTER_IN_PARENT);

         27.android java.lang.NoSuchFieldError: R$id.xxx异常

第一种情况 参考自http://www.shangxueba.com/jingyan/1856083.html

将引用的自定义控件的xml文件中的最外层布局上面添加xmlns:sat=“http://schemas.android.com/apk/res/控件所在位置的包名”可是在运行时就会报java.lang.NoSuchFieldError:包.R$id.xxx错。同时还会出现no resource identifier found for attribute 的错误。

将xmlns:sat=“http://schemas.android.com/apk/res/控件所在位置的包名”更改为

http://schemas.android.com/apk/res-auto 就不会报错了

第二种 参考:http://www.hankcs.com/program/mobiledev/e-androidruntime-fatal-exception-main-java-lang-nosuchfielderror.html

这个问题是由于主项目覆盖了库项目的xml所致,如果主项目中的某个xml里定义了一个跟库项目中的xml同名的xml,那么库中的xml将会被覆盖。这里的覆盖意思是,编译后只有主项目中的xml以及R.id,完全没有库项目的影子。所以才会有NoSuchFieldError的错误。

这个错误不会在编译的时候提示,算得上一个陷阱了。

解决方法很简单,删除主项目中的xml,整个项目只保留一份xml即可


你可能感兴趣的:(Android学习笔记)