記錄平時Android開發中的一些不容易記憶的bug解決方法

這裏記錄着我在開發中學習中遇到的一些問題,和如何去解決這些問題的方法。

1、ListView、GridView和ScrollView嵌套使用導致界面不是顯示在頂部,而是往下滑動了一段距離。

解決:ListView.setFocusable(false)或GridView.setFocusable(false) 有多少個ListView、GridView就寫多少個setFocusable(false)方法

2、點擊ListView、GridView時獲取被點擊的那一項的item,實現局部刷新。

int currentPos = ListView.getFirstVisiblePosition;獲取ListView第一個顯示的item的位置,然後用點擊的位置(這個容易獲得)減去currentPos,得到的位置就是當前界面點擊的位置,之後使用ListView.getChildAt(相減後的位置值),返回一個View對象,這個view對象就是點擊的那個item,然後可以進行其他操作了。

3、Activity A跳到Activity B中,A中的onPause方法先執行,然後執行B中的onCreate、onStart、onResume,最後執行A中的onStop方法,所以在onPause方法中不能執行耗時操作,以便B能立馬被創建。

4、Activity裏面使用Fragment,然後Fragment中有ViewPager ,ViewPager 裏面用的是Fragment,當app放在後臺後,手機內存不夠,一旦重新回到app內,就會出現空白的情況,這種情況在之前的開發中經常出現,頭疼,後來才發現在Fragment中嵌套Fragment時getFragmentManager()應該替換成getChildFragmentManager(),例:mViewPager.setAdapter(new ViewPagerAdapter(getChildFragmentManager(), mFragemnts));這樣就算APP崩潰了,也會重新回覆有數據的界面。

5、在配合Scrollview做背景透明度漸變的時候,使用getBackground().setAlpha()導致其他佈局的背景透明度也發生變化,是因爲它們都是公用同一個狀態。使用getBackground().mutate().setAlpha()後讓控件不共享狀態,這樣就能單獨控制一個控件的背景透明度了。

6、在安卓的xml文件中,TextView控件中直接給Android:text="你好\n世界" 那麼運行起來就會換行,如果用代碼設置textView.setText("你好\\n世界");,那麼就直接輸出/n,達不到換行的效果,所以要用textView.setText("你好\\n世界".replace("\\n","\n"));做處理,這樣就會換行。

7、Activity和Fragment結合使用的時候會出現一些異常,如:Can not perform this action after onSaveInstanceState這個時候就不能直接使用FragmentTransaction.commint方法了,應該使用FragmentTransaction.commitAllowingStateLoss()方法代替。

8、在ViewPager中想要刪除某一個item,需要在適配器中重寫一個方法:getItemPosition(Object object) return POSITION_NONE;返回的是個常量,並且在instantiateItem()和destoryItem中的返回的potiosn值不能直接使用,需要和item集合的大小求餘所得的值纔是正確的,最後調用集合的remove()方法刪掉指定位置的item,調用下適配器的刷新方法,這樣就成功刪掉某一個item。(有個問題,實際刪除測試中,有個大圖會和其他圖片重疊,不知道是不是圖片太大還是什麼原因)

9、使用getIdentifier()方法獲取應用報下的資源ID。例:getResources().getDrawable(getResources().getIdentifier("image","drawable",getPackageName()));

獲取當前應用下的圖片“image”的資源id。

10、XML 屬性anroid:clipToPadding 默認爲true,表示當ViewPager或ListView裏面使用android:padding 屬性時裁減掉padding部分;false:不裁減掉padding部分,依然能看到item項,類似ViewPager的畫廊效果。

11、View中的兩個方法,getGlobalVisibleRect(Rect)和getLocalVisibleRect(Rect),getGlobalVisibleRect:獲取視圖在屏幕中的可視區域(左,上,右,下);getLocalVisibleRect:獲取視圖本身可見的座標區域,座標以自己的左上角爲原點(0,0),只要視圖沒有被遮擋,座標總是等於(0,0,view.getwidth(),view.getHeight())。

12、在代碼中設置EditText的輸入類型是小數類型,EditText.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL|InputType.TYPE_NUMBER_FLAG_SIGNED);。

13、onRequestPermissionsResult在Fragment中不回調。如果Fragment是android.support.v4.app.Fragment,在Fragment中請求權限時,直接用requestPermissions(@NonNull String[] permissions, int requestCode)如果Fragment所在的Activity是AppCompatActivity,用ActivityCompat.requestPermissions。

14、解決git bash 每次操作需要輸入賬號密碼的問題 在git bash 中執行 git config --global credential.helper store 然後執行其他操作時會提示輸入賬號密碼,輸完後下次操作就不會出現輸入賬號密碼的情況

15、App運行中,當按home鍵到桌面,然後點擊App的icon進入App,會再次進入App的 啓動頁,然後進入MainActivity中,應該進入回到桌面之前的界面。解決:在App最先啓動的Activity的onCreate方法中加入如下代碼

 if (!isTaskRoot()) {//是否是任務棧中的根Activity,是的話啓動,否的話說明棧中存在了activity,不需要重新啓動
            finish();
            return;
        }

16、AlertDialog設置寬佔滿全屏 ,AlertDialog設置如下style,但是會導致輸入法彈出時,dialog不會被頂上去的問題

<style name="dialog_full_screen"> 
        <item name="android:windowFullscreen">true</item>  
    </style>

還有一種解決方法是,給window設置一個背景,這樣就能寬度撐滿全屏,也會被輸入法頂上去

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));

17、Dialog中可以輸入內容的時候,輸入法彈出來後,當點擊彈窗外部時,彈窗消失,而輸入法沒有消失的問題。在AndroidManifest.xml中的相應的activity加入android:windowSoftInputMode="adjustPan"熟悉,解決輸入法不隱藏的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章