安卓开发错误录,1年时间总结出来的,所有的东西都是亲自踩坑,主要自己看,有需要的也可以看看


  1.  持续更新中
  2. 布局适配,button在低分辨手机上显示在最下面,高分辨手机上显示在最上面,解决方法,把他放在relative中,给设置layout_weight值,让他居中显示,button也居中显示,这样就行了
  3. imageloader修改图片是不能及时显示问题,再设置图片之前要清理一下内存缓存就可以了了,然后再显示的时候可以设置延时,之前是1秒,现在改一下就好了,ok
  4. gson解析json,如果解析成list时不成功,
    1. 解决方法:Type type = new TypeToken<List<CallItem>>() {}.getType();  mData = newGson().fromJson(datas, type);中间用来type来处理
  5. 安卓Style中带有layout的属性设置不成功:
    1. 解决方法:layout是跟上下文有关的,Style中设置无效果
  6. jar包导入无效,    解决办法:jar包应该放在/项目名/app,这个目录下面,有时候会放错就不能读取出来了,同时jni的so文件必须放到\app\src\main\jniLibs这个文件夹下面,否则不能读取
  7. 环信集成中登录注册处使用Toast报错,        解决:用Dialog代替
  8. studio中引入module时报错 出现该问题unspecified on project app resolves to an APK archive which is not supported as a compilation dependency,
    1. 解决方案:此时ModuleB的build.gradleapply plugin: 'com.android.application' 改成apply plugin: 'com.android.library' ,Gradle将编译称为一个Library,也就是库,运行之后,如果出现这个问题:Error:Library projects cannot set applicationId. applicationId is set to 'package_name' in default config.,那是因为一个库不允许设置applicationId,需要将builde.gradle — android — defaultConfig中的applicationId删除;
    2. setting.gradle中的配置include 后面是项目名,有多少个项目就会出现几个项目名,要删除项目直接在这里删除项目名字即可
  9. studio界面上不能显示中文:        File > Settings > Appearance & Behavior > Appearance,将default fonts(或者是name的值,其实是同一个东西)改为Microsoft YaHei(改成其它SimHei,SimSun也行,但个人觉得雅黑好看些)。
  10. studio内文件不能显示中文:     File > Settings > Editor > File Encodings 里Project Encoding改为UTF-8,为了统一规范,我也将其它Encoding项也设置为UTF-8了。
  11. 关于资源文件放在那里
    1. values文件夹下面的colors中配置的颜色值可以用作drawable
    2. color文件夹下面的xml可以用作drawable,等同于drawable文件夹下的文件,所以selector文件放在那里都可以
    3. 其实两者是相同的,只是在color文件夹下的color是可以select的
  12. 测量控件高度
    1. int w = View.MeasureSpec.makeMeasureSpec(0,
  13.  View.MeasureSpec.UNSPECIFIED);
    int h = View.MeasureSpec.makeMeasureSpec(0,
            View.MeasureSpec.UNSPECIFIED);
    llsearchbar.measure(w, h);
    mHeightSearchBar = llsearchbar.getMeasuredHeight();
    1. private int measureHeight(View view) {
    2. int w = View.MeasureSpec.makeMeasureSpec(0,
    3. View.MeasureSpec.UNSPECIFIED);
    4. int h = View.MeasureSpec.makeMeasureSpec(0,
    5. View.MeasureSpec.UNSPECIFIED);
    6. view.measure(w, h);
    7. return view.getMeasuredHeight();
    8. }

  14. 改变控件高度
    1. GridView myGrid= (GridView) findViewById(R.id.gridview);    
    2. LinearLayout.LayoutParams linearParams = (LinearLayout.LayoutParams) mGrid.getLayoutParams(); // 取控件mGrid当前的布局参数   
    3. linearParams.height = 50;// 当控件的高强制设成50象素   
    4. myGrid.setLayoutParams(linearParams); // 使设置好的布局参数应用到控件myGrid    
viewpager的adapter写法:
  1. package com.shixi.a;
  2. import android.support.v4.view.PagerAdapter;
  3. import android.view.View;
  4. import android.view.ViewGroup;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. /**
  8. * Created by z on 2016/6/2.
  9. */
  10. public class basePagerAdapter extends PagerAdapter {
  11. private List<View> mViews;
  12. public basePagerAdapter(List<View> datas) {
  13. mViews = new ArrayList<>();
  14. mViews.addAll(datas);
  15. }
  16. @Override
  17. public int getCount() {
  18. return mViews.size();
  19. }
  20. @Override
  21. public boolean isViewFromObject(View view, Object object) {
  22. return view == object;
  23. }
  24. @Override
  25. public void destroyItem(ViewGroup container, int position, Object object) {
  26. container.removeView(mViews.get(position));
  27. }
  28. @Override
  29. public Object instantiateItem(ViewGroup container, int position) {
  30. container.addView(mViews.get(position));
  31. return mViews.get(position);
  32. }
  33. }

  1. fragment中获取Activity中的对象

  1. HomeActivity activity = (HomeActivity) getActivity();
  2. FragmentTabHost fragmentTabHost = activity.fragmentTabHost;

  1. shape:
    1. 放在drawable目录下才可以
    2. 画ring要指定内圆半径
    3. 画oval要指定size
  2. fragmentDialog显示紧贴屏幕边缘
    1. 必须给其所在的window设置一个背景色才可以,这是个bug
  3. 界面上其中一个控件设置背景色造成背景色混乱,或者设置不成功
    1. 不要用setalpha,而用setBackgroundColor(alp,255,100,100)成功解决
  4. 对话框移动动画:%0-100反而是缩小的动画,100%-0%反而是放大了,到底怎么回事?没解决
  5. 录音报错,主要是录音类必须所有配置完成之后才可以准备,否则状态不对
  6. scrollview滚动无效果,解决方案::scrollview.smoothScrollTo(0, 0);而不用其他方法,其他方法有时候会失效
  7. textview代码设置drawableleft不起作用:
    1. 解决Drawable drawable= getResources().getDrawable(R.drawable.drawable);
      /// 这一步必须要做,否则不会显示.
      drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
      myTextview.setCompoundDrawables(drawable,null,null,null);
  8. scrollview子布局高度发生变化时,会自动滑动到相应高度,但是要禁用这个功能
    1. 只需要重写他的这个功能即可
      @Override
      protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
          return 0;
      }
  9. glide加载圆角图片失败,imageview设置为centcrop等,只要有剪切就不能设置成功,所以一般不建议用,如果实在不能满足需要可以用cardview实现圆角
  10. 百度地图,把某一个点设置成中心点
    1. //新建一个状态
      MapStatus mMapStatus = new MapStatus.Builder()
              .target(point)
              .zoom(12)
              .build();
      MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
      //改变地图状态
      map.setMapStatus(mMapStatusUpdate);
  11. asset目录在src\main目录下,否则不能读取
  12. 微信签名方式:b24faf618293d1d3032c0793cbe121fd56c1f96c,不能大写,不能有:否则分享失败,分享闪退
  13. viewpager,viewpagerindicator布局没设置,导致报错,这个布局是必须设置的,所以要先设置布局,再填充数据,这是一个固定的模式,以后也是这样一个流程
  14. 以后遇到viewpager,如果里面的内容超过一个控件一定要用fragment,否则后患无穷,问题太多了,千万不要自己定义view添加进去
  15. ++,和--,最好不要用,有时候他妈根本不起作用,还是规规矩矩的来吧,草
  16. startactivityforresult的时候,第二个activityfinish的时候如果带数据过去,必须只能finish一次,第二次finish的时候就不会再带数据了,而且finish之前必须setresult
  17. 软件原则,界面与数据分离,先写好界面,数据在界面完全初始化之后才逐个填充,数据驱动界面,
  18. fragment的ui重绘问题,如果view!=null的时候复用即可,包括数据也可以复用,这也同时可以解决数据多次加载问题
    1. @Override
    2. public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    3. if (view == null) {
    4. view = inflater.inflate(R.layout.fragment_tableindex, container, false);
    5. }
    6. // 缓存的viewiew需要判断是否已经被加过parent,
    7. // 如果有parent需要从parent删除,要不然会发生这个view已经有parent的错误。
    8. ViewGroup parent = (ViewGroup) view.getParent();
    9. if (parent != null) {
    10. parent.removeView(view);
    11. }
    12. return view;
    13. }

  19. 时间格式化的时候时间时long类型的,后面必须加L,要不然就格式化错误,因为他是整形的,只能达到整形的最大值,所以会格式化成1970年
  20. 打开别人的项目运行不起来,打开一个能运行的项目,然后在项目的gradle设置里面,按照能运行起来的项目的配置全部配置一遍即可
  21. fragment嵌套fragment时zifragment有时不能显示数据,使用:mVpViewPager.setAdapter(new MyMessageViewPagerAdapter(getChildFragmentManager(), list, titles));而不用activity的getFragmentManager
  22. 下拉刷新列表中,设置条目点击事件时,下拉时就触发点击事件, 解决办法:在listview的adapter里面设置点击事件,而不是用itemclick事件
  23. webview退出之后里面的音乐还在播放,用destroy方法可以停止,mWebViewWebView.destroy();
  24. viewpager的多个标签页面销毁,导致数据异常,解决方法在笔记中搜索
  25. fragment的onCreateView方法每次可见 时都会调用,而oncreate只调用一次,所以数据最好是在oncreate中加载,而不要放在oncreateview中免得每次可见时又去加载数据
  26. startActivity方法会重新走要start的activity的oncreate方法,从而导致数据多次加载,所以在不需要startactivity的地方不要使用.
  27. 网络仓库第一次提交:1.建立网络仓库,2.克隆到本地,3.把自己的项目复制到克隆的文件夹,4设置要add的文件,5.提交,push
  28. Android studio 项目那些文件需要提交到git中?1.app目录下除了build文件夹和iml文件 2. .gitIgnore和build.gradle文件(重要),gradle文件夹,gradlew,gradew.bat,这三个文件可传可不传,可以自动生成,但是不传的话编译的时间会很长 3.setting.gradle文件(重要) 4.如果有library依赖,则跟app目录下规则相同
     
     
  29. 视图树的使用:view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Log.e("行数", getLineCount() + "");//使用完以后需要,否则一直调用下去,view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
    });
  30. 引入的库需要的最小api为16,当前项目最小api为14,不能因为引入一个库就把自己的项目的api升高,那么在manifest中配置如下代码:
    1. <uses-sdk tools:overrideLibrary="com.facebook.shimmer引入的包名"/>

  31. fragment替换的时候,布局中必须是fragmentlayout才能被fragment替换,否则会出问题.显示不出来,谨记!!!!!!!!!!!
  32. activity跳转携带map数据的实现方法:
  33. imageview的selector设置不起作用:解决方法,selector的默认状态的item放在最后面,否则不能显示正常
  34. selector使用:color文件夹下也可以建立selector文件,主要给设置color使用,如果给text设置selector必须用color的selector,同时selector的item中不可以有@null这样的引用,drawable文件夹下的selector中,drawable是可以用颜色值代替的,但是color文件夹下面的item的color属性只能用color值,而且background必须使用drawable,也就是作为background的selector的item必须是drawable标签,作为color值的selector的item标签必须为color,至于引用的是color值还是drawable的id,这个无关紧要,;;;;不能用color,条件:selector的默认属性状态的item放在在下面,也就是最上层才能起作用.否则默认不能实现效果,并且如果是不可点击的布局,必须设置点击事件,或者设置clickable为ture
  35. 环信引入easeui错误:必须删除build.gradle文件才行,环信也是服了你了,唉,不多写了.
  36. fragment只有依附activity或者是fragment之后才可以使用getactivity或者getcontext,否则得到的是null.
  37. View类的两个新api,超牛逼,超方便,view里面还有很多好东西,值得研究一下
    1. public boolean post (Runnable action),可以在这个方法里面更新ui,是一个非常方便的方法
    2. public boolean canScrollHorizontally (int direction)返回值代表是否可横向滑动,方向0代表向左,1代表向右public boolean canScrollVertically (int direction)同样,1代表向上,0代表向下
  38. 圆角图片显示方案:使用cardView,设置圆角,并且设置scaletype值,然后显示图片之后,再设置imageview的width为match_parent,高度为屏幕宽度的一半,这样就能按照合适的比例显示了(这是2:1,可以按照自己的需求去做),而且图片能够完全占满cardview,看起来非常漂亮,注意顺序,先加载图片,再去改变他的大小
    1. ImageView view = (ImageView) holder.getView(R.id.iv);
    2. Glide.with(getContext()).load(bean.img_src).into(view);
    3. int width = DensityUtils.getDisplay(getActivity()).getWidth();
    4. view.getLayoutParams().height = width / 2;
    5. view.getLayoutParams().width = RecyclerView.LayoutParams.MATCH_PARENT;

  39. 方法数超限怎么办?:
  40. 插件:显示方法数Android Methods Count,
  41. 安卓开发引入很多第三方库容易冲突解决方案:单独建立一个module,里面放公共资源,utils,统计,分享,地图等第三方库,常用对话框,等等都放入这个module中,以后添加任何module的时候如果需要里面的资源就直接依赖即可,这个独立的module可以导入到任何工程中使用,而且节省了配置时间,同时第三方库的升级工作也可以分离开,更加方便更加安全
  42. swipelayout之viewDraghelper:(1)getViewHorizontalDragRange方法的返回值应当是该childView横向或者纵向的移动的范围,当前如果只需要一个方向移动,可以只复写一个。其实是潮着某个方向移动的绝对值,比如向右移动,最多能移动多少,那就返回多少,因为向左移动最多也是返回这么多,这个是移动(2)
  43. 有时候测量控件出问题,使用viewutil也不行,可以页面加载一段时间之后再测量,就准确了
  44. float数据去掉整数后面的.0方法:if (((int) progress) == progress) {转为int值}else{保留原来值}
  45. fragment只有可见时才能显示出东西,才会调用oncreate,oncreateview等方法,有时候会用到
  46. fragmentdialog,v4包下的,使用,
    1. 适配不同屏幕,重写oncreatedialog方法,在此方法中返回一个v7下的alertdialog,并且setview
    2. 设置背景颜色,在oncreateview方法中getwindow,然后设置背景drawable
    3. 设置window的背景颜色,@Override
      public void onStart() {
          super.onStart();
          Window window = getDialog().getWindow();
          WindowManager.LayoutParams windowParams = window.getAttributes();
          windowParams.dimAmount = 0.0f;
          window.setAttributes(windowParams);
      }
  47. 问题:The number of method references in a .dex file cannot exceed 64K.
    1. 解决方法:http://blog.csdn.net/LikeSidehu/article/details/52606442
    2. 其实不一定是方法数超过64k,可能是引用的库太多了,但是这个方法就是有用
    3. 还有的时候是因为引用的库或者jar重复了,这个就要新建一个工程,把所有的引用都配置成相同的,一个个删除,看看到底是哪个jar或者库重复了, 然后去掉
  48. Android studio中批量替换文本:edit->find->replace in path
  49. Error:Jack is required to support java 8 language 解决:
    http://www.th7.cn/Program/java/201610/994364.shtml
  50. 获取recyclerview已经滑动的高度 
    1. public int getScollYDistance() {
        int position = linearLayoutManager.findFirstVisibleItemPosition();
        View firstVisiableChildView = linearLayoutManager.findViewByPosition(position);
        int itemHeight = firstVisiableChildView.getHeight();
        return (position) * itemHeight - firstVisiableChildView.getTop() }
51.textView.settextsize()默认就是用sp单位的,在显示时不管是sp还是dp都是换算成px值来显示的,
52.按下返回键让在后台运行,而不是退出程序
  1. @Override
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {
  3. if (keyCode == KeyEvent.KEYCODE_BACK) {
  4. moveTaskToBack(false);
  5. return true;
  6. }
  7. return super.onKeyDown(keyCode, event);
  8. }
53.fragment的hide show方法和replace方法的异同点:replace方法会销毁原来的fragment,而hide不会,所以如果只是使用一次就可以用replace,如果要频繁的替换多个fragment就用add之后hide和show
53.全屏配置,1.让自己的application使用appthem,然后appthem继承自noactionbar的them即可
                        2.在appthem中添加notitle,没有title,fullscreen全部全屏
                        3.单个activity可以配置自己的them
                        4.在activity中setcontentview之前,可以设置
                        5.screenorientation这个配置必须每个activity都配置才能起作用,不能继承下来
54.自定义控件中get到的技能
        1.textview的settextSize方法中用的是sp值,但通过array.getDimension方法获取的值是px值,所以需要转换才能使用
        2.getDimensionPixelOffset和getDimensionPixelOffset相同,但第一个返回int值,第二个返回float值,返回值都是px值,即使你设置的是dp值或者sp值,他都会转换成px值,平时用这两个方法就好了,另一个方法不好用,不说了
        3.int color = Color.argb(255,100,200,100);textview.setTextColor方法参数是int,可以使用这个方法把color值转换成int值,而且资源文件中获取到的color引用最后也都是转换成int值的.
4.shape的颜色可以动态通过代码改变,方法如下
GradientDrawable background = (GradientDrawable) tag.getBackground();
background.setColor(color);
tag.setBackgroundDrawable(background);
55.泛型继承:
1.A<T> extent B<T>那么这个t是从b继承下来的
2.A<T> extent B 那么这个t是A类里面自己定义的,
3.上面两种情况的使用方法是相同的,比如新建一个A的对象new A<T>();
4.A<T,E> extend B<T>,那么t是继承下来的,跟父类相同,e是自己新定义的.
56.PagerAdapter总结
1.直接用pageAdapter,内存中保存前一页和下一页,本页,总共三页数据,当然可以设置更多,实现4个方法
2.FragmentPageAdapter,内存中保存所有加载的页面,只需要实现两个方法
3.FragmentStatePagerAdapter,内存中只会保存当前页面,任何不可见页面都会被销毁,省内存,但是反复加载数据,浪费性能,除非页面的数据非常庞大,并且也特别多的页面,否则不建议使用,只需要实现两个方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章