在安卓开发中,相信大家都会遇到各种各样的问题,掌握一些开发技巧,并有效的避免这些坑还是灰常重要的。Android 老鸟们应该在夜以继日的码农生涯中总结了不少坑和避开这些坑的方法,菜鸟们就比较可怜了,刚踏入码农界,一无所知,常常被这些坑伤滴遍体鳞伤。本文是小编在 android 开发教程网上搜罗的一些 android 开发中比较常见的坑和解决办法,菜鸟们都看过来吧
- 在 Activity 还没完全显示时,弹出 PopupWindow 或者 Dialog 崩 Activity not running 错误
解决方案: 重写 onWindowFocusChanged 方法
public void onWindowFocusChanged(boolean hasFocus) {
if (hasFocus) {
if (!mIsInitData) {
initData();
mIsInitData = true;
}
}
super.onWindowFocusChanged(hasFocus);
}
protected void initData() {
// 在此处编写弹出 Popup 或者 Dialog 的方法
}
- 在 library 中使用 switch 语句处理 id 时报错
产生原因:library 中生成的 R 文件中生成的 id 没有用 final 修饰;
解决方案:使用 if else 替换 switch
- 不要在 Application 中缓存任何数据,NoPointException
产生原因:一般情况下不会出现异常,当按下 Home 应用隐藏到后台,长时间未使用,导致应用被回收,当再次启动时,Application 会重新创建,而 Activity 此时再向 Application 里取数据,异常发生
解决方案:将数据缓存到 sp 或者数据库或者 sd 卡。或者在使用 Application 缓存数据时,进行 null 判断
-
AsyncTask 只能执行一次
-
提取一个 BaseActivity,里面进行一些统一处理,能让你的代码更简洁。
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);
}
}
- 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
}
}
}
-
标题栏样式抽取,抽取思路大概有两种:
第一种:用标签在 xml 布局时引入
第二种:自定义一个 TitleView。
不仅仅是标题栏,字体大小,主题颜色,能抽取的都统一处理。 -
TextView.setText();中要显示 int 类型的值,用 String.valueOf()转,不要直接 124+“”,不知道为什么这样的童鞋,去看看源码就知道为什么了。
-
退出应用方式:
1)直接杀死进程
2)在 BaseActivity 中注册一个广播,发送广播关闭
3)定义一个全局容器存储 Activity 应用,退出时遍历退出(不推荐) -
一个功能分几个页面处理时,使用 Dialog 模拟 Activity 避免了数据在 Activity 之间传递。
-
手机重启,通过不断的 new 空 Toast,导致系统奔溃而重启,想想竟有一种无言以对的感觉,原来 Toast 还可以这么玩
public void onClick(View v){
while(true){
Toast toast = new Toast(this);
toast.setView(new View(this));
toast.show();
}
}
- View 类中的 setSelected(boolean)方法结合 android:state_selected="" 用来实现图片选中效果,自定义标题栏用起来很方便;
- EditText 中有个 android:digits="" 属性,用来自定义输入的字符类型,比如输入身份证只能是数字和 x 或者 X 使用 android:digits="1234567890xX" 就轻松搞定了,不用再在代码里面进行校验了;
以上就是 android 中,比较常见的一些问题,及出现这些问题的原因、解决办法,可能还有整理得不是很全面的地方,欢迎大家补充分享。
相关文章:《Android 学习之 JSON 解析详解》
http://www.maiziedu.com/group/article/10955/
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于