Android 开发技巧 开发常见问题归纳 需要注意的坑和解决方案

1. 在Activity还没完全显示时,弹出PopupWindow或者Dialog  崩Activity not running 错误

        解决方案: 重写onWindowFocusChanged方法

        @Override
	public void onWindowFocusChanged(boolean hasFocus) {

		if (hasFocus) {
			if (!mIsInitData) {
				initData();
				mIsInitData = true;
			}
		}

		super.onWindowFocusChanged(hasFocus);
	}

	protected void initData() {
            // 在此处编写弹出Popup或者Dialog的方法
	}
2. 在library中使用switch语句处理id 时报错

        产生原因:library中生成的R文件中生成的id 没有用final 修饰(不要问为什么,我也想知道)

        解决方案:使用if else 替换switch

3. 不要在Application中缓存任何数据,NoPointException

       产生原因:一般情况下不会出现异常,当按下Home 应用隐藏到后台,长时间未使用,导致应用被回收,当再次启动时,Application会重新创建,而Activity此时再向Application里取数据,异常发生

       解决方案:将数据缓存到sp 或者数据库或者sd卡。或者在使用Application缓存数据时,进行null判断

4. AsyncTask只能执行一次

5. 提取一个BaseActivity,里面进行一些统一处理,能让你的代码更简洁。继承第三方框架的时候也很方便处理,特别是继承友盟统计是,如果没有Base,那你就哭(┬_┬)吧

public abstract class BaseActivity extends Activity implements OnClickListener {

	private boolean mIsInitData;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
	}
	@Override
	public void setContentView(int layoutResID) {
		super.setContentView(layoutResID);
		initView();
	}
	@Override
	public void onWindowFocusChanged(boolean hasFocus) {

		if (hasFocus) {
			if (!mIsInitData) {
				initData();
				mIsInitData = true;
			}
		}

		super.onWindowFocusChanged(hasFocus);
	}

	protected void initData() {

	}

	protected abstract void initView();

	/**
	 * 获取View
	 * 
	 * @param id
	 * @return
	 */
	@SuppressWarnings("unchecked")
	protected <T extends View> T mGetView(int id) {
		return (T) findViewById(id);
	}

	/**
	 * 获取Button的实例 并绑定点击事件
	 * 
	 * @param id
	 * @return
	 */
	protected Button mGetButtonSetOnClick(int id) {

		Button btn = (Button) findViewById(id);
		btn.setOnClickListener(this);
		return btn;
	}

	/**
	 * 获取ImageView的实例 并绑定点击事件
	 * 
	 * @param id
	 * @return
	 */
	protected ImageView mGetImageViewSetOnClick(int id) {

		ImageView image = (ImageView) findViewById(id);
		image.setOnClickListener(this);
		return image;
	}

	/**
	 * 获取View的实例 并绑定点击事件
	 * 
	 * @param id
	 * @return
	 */
	protected View mGetViewSetOnClick(int id) {

		View view = (View) findViewById(id);
		view.setOnClickListener(this);
		return view;
	}

	/**
	 * 获取TextView中的文本信息
	 * 
	 * @param tv
	 * @return
	 */
	protected String mGetTextViewContent(TextView tv) {
		return tv.getText().toString().trim();
	}

	/**
	 * 获取EditText中的文本信息
	 * 
	 * @param et
	 * @return
	 */
	protected String mGetEditTextContent(EditText et) {
		return et.getText().toString().trim();
	}
        protected void showHintMsg(int sid) {
		MToast.showToast(this, getResources().getString(sid));
	}
	protected void showHintMsg(String sMsg) {
		MToast.showToast(this, sMsg);
	}

}

6. Toast定义为全局,避免一直不断的吐吐吐吐。

     

public class MToast {
	private static Toast mToast;

	private static TextView tv_content;

	public static void showToast(Context context, String msg) {
		try {

			if (mToast == null) {
				mToast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
				mToast.setGravity(Gravity.TOP, 0,
						DensityUtil.dip2px(context, 3));
				View view = View.inflate(context, R.layout.m_toast, null);
				tv_content = (TextView) view.findViewById(R.id.tv_content);
				mToast.setView(view);
				tv_content.setText(msg);
			} else {
				tv_content.setText(msg);
			}
			mToast.show();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}

7. 标题栏样式抽取,抽取思路大概有两种,第一种:用<inlcude>标签在xml布局时引入,第二种:自定义一个TitleView,千万不要偷懒节省这个步骤。指不定那天产品就要让你改个样式,到时候你就哭吧。不仅仅是标题栏,字体大小,主题颜色,能抽取的都统一处理,产品的心和女人的新一样,说变就变。

8. TextView.setText();中要显示int类型的值,用String.valueOf()转,不要直接124+“”,不知道为什么这样的同学,基础太差,去看看源码就知道为什么了。

9. 退出应用方式,1.直接杀死进程 2.在BaseActivity中注册一个广播,发送广播关闭 3.定义一个全局容器存储Activity应用,退出时遍历退出(不推荐)

10. 一个功能分几个页面处理时,使用Dialog 模拟Activity 避免了数据在Activity之间传递。

11. 手机重启,知乎上看到滴,通过不断的new 空Toast,导致系统奔溃而重启,想想竟有一种无言以对的感觉,原来Toast还可以尼玛这么玩

public void onClick(View v){
       while(true){
            Toast toast = new Toast(this);
             toast.setView(new View(this));
             toast.show();
     }

}

12. View类中的 setSelected(boolean)方法结合android:state_selected="" 用来实现图片选中效果 自定义标题栏用起来很方便;

13. EditText 中有个 android:digits="" 属性,用来自定义输入的字符类型,比如输入身份证只能是数字和x或者X  使用 android:digits="1234567890xX"  就轻松搞定了,不用再在代码里面进行蛋疼的校验了;

今天就补充到这

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值