安卓開發錯誤錄,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,內存中只會保存當前頁面,任何不可見頁面都會被銷燬,省內存,但是反覆加載數據,浪費性能,除非頁面的數據非常龐大,並且也特別多的頁面,否則不建議使用,只需要實現兩個方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章