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);
第一种情况 参考自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即可