博主毕业以来总结的android经验,想起来什么就加点

1,api10以下尽量用padding,margin很多的时候会有bug,显示不出效果


2,混淆,最好不要混淆实体类,用到反射的时候会报错

-keep public class com.bocop.commons.bean.**
-keepclasseswithmembers class com.bocop.commons.bean.** {
    *;
}

3,非常好用的收键盘方式,适用fragment

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
收键盘代码
if (getActivity().getWindow().getAttributes().softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
	if (getActivity().getCurrentFocus() != null)
		imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

4,EditText不获取焦点不获取光标的方法

在EditText的包裹空间加入2个属性即可
 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:orientation="vertical" >
	<EditText
            android:id="@+id/et_phone"
            style="@style/text_black_default_bg"
            android:layout_width="match_parent"
            android:inputType="phone" />
</LinearLayout>

5,如何实现在Tabhost中的activity overridePendingTransition()切换效果


public class AnimCommon {//维护页面切换效果工具类
	
	public static int in = 0;
	 
	public static int out = 0;
	 
	public static void set(int a, int b){
		in = a ;
		out = b;
	}
	 
	public static void clear(){
		in = 0;
		out = 0;
	}
}

在tabhost的onPause周期实现
public void onPause() {
		
	super.overridePendingTransition(AnimCommon.in, AnimCommon.out);
	AnimCommon.clear();

	super.onPause();

}

在activity中startActivity或者finish的实现
Intent intent= new Intent(this, *.class);
AnimCommon.set(R.anim.push_left_in, R.anim.push_left_out);
this.startActivity(intent);

6,视图大小的控制是由父视图、布局文件、以及视图本身共同完成的,父视图会提供给子视图参考的大小,而开发人员可以在XML文件中指定视图的大小,然后视图本身会对最终的大小进行拍板


7,当listview含有Header时,在onItemClick事件中请这样获取ItemObject:Object obj = parent.getAdapter().getItem(position); 先判空,再强转为需要的对象。这样就可以避免手动在onItemClick中(positon-header数量)了。转自马天宇大神。


8,在做自定义view的时候,避免不了各种画图,画图就会用到各种对float的运算,这里做运算的时候要长个心眼。


9,主动关闭Alert.Dialog.builder,可以借助builder.create(),返回的对象为AlertDialog。

这里还要说一下,builder本身是没有dismiss()和cancel()方法的

AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
		alertDialog.setView(upload_menu);
		alert = alertDialog.create();
		alert.show();
		
		alert.dismiss();


10,BitmapFactory.decodeStream(InputStream is,Rect outPadding,Options opts) 返回null的问题

很多人会遇到这样的情况,通过上面的方法返回null的问题,如下代码

BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		InputStream openInputStream = null;
		try {
			openInputStream = getContentResolver().openInputStream(mPicUri);
			Bitmap bm = BitmapFactory.decodeStream(
					openInputStream, null,
					options);
			options.inJustDecodeBounds = false;
			int be = (int) (options.outHeight / (float) 200);
			if (be <= 0)
				be = 1;
			options.inSampleSize = be;
			openInputStream = getContentResolver().openInputStream(mPicUri);
			bm = BitmapFactory.decodeStream(openInputStream, null,
					options);
			Matrix matrix = new Matrix();
			mPicBitamp = Bitmap.createBitmap(bm, 0, 0, bm.getWidth() - 10,
					bm.getHeight() - 10, matrix, true);
			bm.recycle();
			showPic(mPicBitamp);
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}finally{
			if(null!=openInputStream){
				try {
					openInputStream.close();
					openInputStream=null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

这是因为我们在两个Bitmap.decodeStream()方法中用了同一支流进行了处理,这里需要我们分别给两只不同的流,如下代码达到效果

		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		InputStream openInputStream1 = null;
		InputStream openInputStream2 = null;
		try {
			openInputStream1 = getContentResolver().openInputStream(mPicUri);
			Bitmap bm = BitmapFactory.decodeStream(
					openInputStream1, null,
					options);
			options.inJustDecodeBounds = false;
			int be = (int) (options.outHeight / (float) 200);
			if (be <= 0)
				be = 1;
			options.inSampleSize = be;
			
			openInputStream2 = getContentResolver().openInputStream(mPicUri);
			
			bm = BitmapFactory.decodeStream(openInputStream2, null,
					options);
			Matrix matrix = new Matrix();
			mPicBitamp = Bitmap.createBitmap(bm, 0, 0, bm.getWidth() - 10,
					bm.getHeight() - 10, matrix, true);
			bm.recycle();
			showPic(mPicBitamp);
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}finally{
			closeInputStream(openInputStream1);
			closeInputStream(openInputStream2);
		}

11,启动三星系统相机导致打开相机的Activity,会被destroy,导致nullpointexception。

发生这个问题可能大家已经分析到了,三星相机会根据用户横持或竖持设备进行旋转,这样就会导致我们开启系统相机的Activity进行销毁重构。我的解决办法是在清单文件里注册android:configChanges="keyboardHidden|orientation|screenSize",如下:
 <activity
            android:name=".view.WantQuestionsActivity"
            android:screenOrientation="portrait"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:windowSoftInputMode="adjustResize" >
       		 </activity>

并且在开启的Activity代码中重写
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		Configuration configuration =new Configuration(newConfig);
		configuration.orientation =Configuration.ORIENTATION_PORTRAIT;
		newConfig.setTo(configuration);
		super.onConfigurationChanged(newConfig);
	}
其时到这里还会有一个问题就是照片旋转了,这里就不贴代码了,相信大家旋转照片网上能搜索一大把的。

12,listview有一个setEmptyView的方法,当adapter等于null或者item等0的时候会显示你设置的布局。



13,验证是否有合适的activity会响应这个intent,需要执行queryIntentActivities() 来获取到能够接收这个intent的所有activity的list。如果返回的List非空,那么你才可以安全的使用这个intent。

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;

如果 isIntentSafe true , 那么至少有一个app可以响应这个intent。如果是 false 则说明没有app可以handle这个intent。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值