• 首页
  • >
  • 网建知识
  • >
  • Android 开发技巧 开发常见问题归纳 需要注意的坑和解决方案
Android 开发技巧 开发常见问题归纳 需要注意的坑和解决方案
发布时间:2016/1/8 来源:搜数网络 浏览:46

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

        解决方案: 重写onWindowFocusChanged方法 

  1.        @Override  
  2. public void onWindowFocusChanged(boolean hasFocus) {  
  3.   
  4.     if (hasFocus) {  
  5.         if (!mIsInitData) {  
  6.             initData();  
  7.             mIsInitData = true;  
  8.         }  
  9.     }  
  10.   
  11.     super.onWindowFocusChanged(hasFocus);  
  12. }  
  13.   
  14. protected void initData() {  
  15.            // 在此处编写弹出Popup或者Dialog的方法  
  16. }  
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,那你就哭(┬_┬)吧

  1. public abstract class BaseActivity extends Activity implements OnClickListener {  
  2.   
  3.     private boolean mIsInitData;  
  4.   
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.           
  9.     }  
  10.     @Override  
  11.     public void setContentView(int layoutResID) {  
  12.         super.setContentView(layoutResID);  
  13.         initView();  
  14.     }  
  15.     @Override  
  16.     public void onWindowFocusChanged(boolean hasFocus) {  
  17.   
  18.         if (hasFocus) {  
  19.             if (!mIsInitData) {  
  20.                 initData();  
  21.                 mIsInitData = true;  
  22.             }  
  23.         }  
  24.   
  25.         super.onWindowFocusChanged(hasFocus);  
  26.     }  
  27.   
  28.     protected void initData() {  
  29.   
  30.     }  
  31.   
  32.     protected abstract void initView();  
  33.   
  34.     /** 
  35.      * 获取View 
  36.      *  
  37.      * @param id 
  38.      * @return 
  39.      */  
  40.     @SuppressWarnings("unchecked")  
  41.     protected extends View> T mGetView(int id) {  
  42.         return (T) findViewById(id);  
  43.     }  
  44.   
  45.     /** 
  46.      * 获取Button的实例 并绑定点击事件 
  47.      *  
  48.      * @param id 
  49.      * @return 
  50.      */  
  51.     protected Button mGetButtonSetOnClick(int id) {  
  52.   
  53.         Button btn = (Button) findViewById(id);  
  54.         btn.setOnClickListener(this);  
  55.         return btn;  
  56.     }  
  57.   
  58.     /** 
  59.      * 获取ImageView的实例 并绑定点击事件 
  60.      *  
  61.      * @param id 
  62.      * @return 
  63.      */  
  64.     protected ImageView mGetImageViewSetOnClick(int id) {  
  65.   
  66.         ImageView image = (ImageView) findViewById(id);  
  67.         image.setOnClickListener(this);  
  68.         return image;  
  69.     }  
  70.   
  71.     /** 
  72.      * 获取View的实例 并绑定点击事件 
  73.      *  
  74.      * @param id 
  75.      * @return 
  76.      */  
  77.     protected View mGetViewSetOnClick(int id) {  
  78.   
  79.         View view = (View) findViewById(id);  
  80.         view.setOnClickListener(this);  
  81.         return view;  
  82.     }  
  83.   
  84.     /** 
  85.      * 获取TextView中的文本信息 
  86.      *  
  87.      * @param tv 
  88.      * @return 
  89.      */  
  90.     protected String mGetTextViewContent(TextView tv) {  
  91.         return tv.getText().toString().trim();  
  92.     }  
  93.   
  94.     /** 
  95.      * 获取EditText中的文本信息 
  96.      *  
  97.      * @param et 
  98.      * @return 
  99.      */  
  100.     protected String mGetEditTextContent(EditText et) {  
  101.         return et.getText().toString().trim();  
  102.     }  
  103.         protected void showHintMsg(int sid) {  
  104.         MToast.showToast(this, getResources().getString(sid));  
  105.     }  
  106.     protected void showHintMsg(String sMsg) {  
  107.         MToast.showToast(this, sMsg);  
  108.     }  
  109.   
  110. }  

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

     

  1. public class MToast {  
  2.     private static Toast mToast;  
  3.   
  4.     private static TextView tv_content;  
  5.   
  6.     public static void showToast(Context context, String msg) {  
  7.         try {  
  8.   
  9.             if (mToast == null) {  
  10.                 mToast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);  
  11.                 mToast.setGravity(Gravity.TOP, 0,  
  12.                         DensityUtil.dip2px(context, 3));  
  13.                 View view = View.inflate(context, R.layout.m_toast, null);  
  14.                 tv_content = (TextView) view.findViewById(R.id.tv_content);  
  15.                 mToast.setView(view);  
  16.                 tv_content.setText(msg);  
  17.             } else {  
  18.                 tv_content.setText(msg);  
  19.             }  
  20.             mToast.show();  
  21.         } catch (Exception e) {  
  22.             // TODO: handle exception  
  23.         }  
  24.     }  
  25. }  

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

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

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

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

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

  1. public void onClick(View v){  
  2.        while(true){  
  3.             Toast toast = new Toast(this);  
  4.              toast.setView(new View(this));  
  5.              toast.show();  
  6.      }  
  7.   
  8. }  

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

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

今天就补充到这

原文:http://blog.csdn.net/soul_code/article/details/50128637

返回