Android裏的小問題和小技巧

1.最好不要把圖片的jpg格式直接重命名爲png格式,要用 格式工廠 之類的工具進行格式轉化更爲妥當,否則會報出相關的錯誤。

2.在LinearLayout裏用layout_weight的時候,如果寫的比例跟我們要的預期相反,可能問題出現在我們的layout_width或layout_height設置成了match_parent。具體情況要看LinearLayout是水平方向還是垂直方向,規範做法是給它們中的一個設置爲0dp。

3.LinearLayout裏的layout_gravity同樣需要根據排列方向來起作用​:如果orientation=”horizontal”,那麼它只在垂直方向起作用;同樣,如果orientation=”vertical”,那麼它就在水平方向上起作用,作用相反。

4.一般來說,我們會這樣寫Button的三種點擊方法:一種是bt.setOnClickListener(this) , 一種是bt.setOnClickListener(new onClickListener)。那麼還有第三種點擊方式是在Button的佈局文件里加入android:onClick=“myClick” ,這樣的話監聽方法就是在Activity裏聲明public void myClick(View v)來執行就可以了。

5.圖片的命名格式首字母不要用大寫。

6.getTaskId()方法能打印出當前的返回棧的id。

7.IntentFilter爲Intent的過濾器,只在AndroidManifest裏以出現,而不出現在java代碼裏。(但是!廣播接收器裏它是通過Context.registerReceiver()函數動態的註冊;它被作爲IntentFilter對象創建。)

8.在使用SQLite的時候,“sqlite3 ***.db ”, 數據庫的名字是有區分大小寫的,所以你原來是怎麼寫的這裏也是一樣。

9.如果你進入sqlite3後由於誤輸入而進入了 “…>”模式的話,如果 “.exit” 和 “.quit ”都不起作用,可以使用ctrl + d來退出。

10.使用Genymotion作爲模擬器的時候,如果像我這樣在學校用銳捷上網,它會經常爆衝突。目前我所知道的解決方法就是在“Network and Sharing Center“的“Change adapter settings”裏把”VirtualBox Host-Only Network #數字“給disabled掉,這樣就可以上銳捷。不過這是治標不治本,因爲當你下次打開電腦的時候,很可能會多出個網絡適配器,我現在電腦裏已經有將近10個了。我原本以爲進入Virtual Box裏將模擬器的上網設置爲NAT,但似乎不起作用,網上也還暫時沒找到解決方法,只能暫時頂住先。

11.使用Genymotion作爲模擬器的時候,有可能可以成功安裝微信,QQ等軟件,但出現點擊打不開的結果。原因可能是Genymotion本身沒有安裝ARM,所以你需要下載Genymotion的ARM插件(一個zip文件),直接拖入你已經打開的模擬器裏(不要用管理員權限去運行),安裝完後重新啓動即可。

12.使用eclipse提交到github的時候,它報出了master:master[rejected -non -fast-forward],這個時候可以試試右鍵工程——team——Add to Index,然後重新提交看看。這是從StackOverFlow上看到的,不過他有後續,完整的是:

May be you are not adding the files to index.

Go to Team > Add To Index. then Rebase > Continue Rebase

then commit in Your Local Master and Push

13.今天打開eclipse發現怎麼之前安裝的github插件沒有了,後來就用管理員權限運行,發現github插件出現了,但ADT卻不見了…在這裏,win8.1的這點還是比較煩人的。所以想給eclipse設置爲默認管理員權限運行,發現網上都基本是win7,win8的。其實大致的方向都是那樣,只是win8.1的位置有些不一樣:

右鍵程序,選擇屬性——兼容性
這裏寫圖片描述

更改對用戶的所有設置

這裏寫圖片描述

以管理員身份運行該程序

這裏寫圖片描述

14.如果你的activity繼承了AppCompactActivity,那麼此時使用requestWindowFeature(Window.FEATURE_NO_TITLE)是沒有用的,而且可能還會報錯。你可以在Manifest裏對你的activity裏添加

android:theme="@style/Theme.AppCompat.Light.NoActionBar"

或者是在activity文件裏添加

ActionBar actionBar = getSupportActionBar();
        actionBar.hide();

要注意導入的包文件的一致,我這裏導入的包是:

import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;

15.錯誤信息:android.view.InflateException: Binary XML file line #66: Error inflating class
最近在開發的時候,總會時不時地APP出現閃退的情況,按理說那只是一個簡單界面,後來查找了發現是圖片的問題,雖然我在界面裏設置它的長和寬爲20dp,但實際那張圖片得好幾千的像素,所以可能錯誤在這裏,因此我就把它改小了,目前就暫時還未發現同樣的問題發生了。

16.當我們在eclipse裏導入RecyclerView的jar包後,編譯出錯的時候:
“進入sdk\extras\android\m2repository\com\android\support\recyclerview-v7\21.0.0目錄,找到recyclerview-v7-21.0.0.aar這個文件。用解壓軟件解壓此文件裏面有classes.jar,把這個jar包放到項目中的libs文件下即可。這個jar包就是RecyclerView要使用的,可以給它改個名字例如android-support-v7-recyclerview.jar , 便於查看。”
參考此blog

17.如果在windows 32位的系統內,安裝完sdk後,卻打不開sdk manager.exe。那麼有一種解決方法是進入android-sdk——tools——lib——find_java.bat。用記事本打開,找到 | %sys_32%\find /i “x86” > NUL && set arch_ext=32 || set arch_ext=64,如果你的“32”和“||”之間有個空格的話,將空格去掉後保存,重新打開即可。

這裏寫圖片描述

這代表着你應該是打開了豌豆莢一類的手機助手工具,將它關閉,或是重新開機。

19.利用真機開發的時候,發現file explorer沒有顯示真機的文件內容,SegmentFault上回我的答案是沒有root,但我用了百度root和root精靈都顯示我已經root,還是沒有顯示我想要的結果。

這裏寫圖片描述
不知道是不是CM系統的緣故,我刷了另外一個系統後,則發現可以正常顯示了。所以我估計是系統的原因。

20.注意onCreate()方法的使用,在創建onCreate()方法的時候,要看清楚它的參數,剛纔發現數據庫一直沒有被創建,而語句沒有錯誤,後來發現是onCreate()方法寫錯了,一個是protected void onCreate(Bundle savedInstanceState),另外一個是public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)。所以要區分好兩者。

21.TextView裏可以設置文字附近帶有圖片,如在xml裏使用drawableLeft之類的。那麼有兩個地方,(1),如果textview設置width爲match_parent,那麼當設置圖片的時候圖片會挨着左右邊緣,這時不能調與文字間的距離,要將width改爲wrap_content。(2)如果想在代碼裏取消圖片的顯示,使用setCompoundDrawablesWithIntrinsicBounds()方法,並將四個參數都設爲0,則圖片會隱藏。

22.當需要填充ImageView的時候,要考慮使用scaleType屬性。其中FitXY可以將其填滿。
23.SDK Manager裏的Extras沒有找到Android Support Repository,一種是在Tools文件夾裏對Android SDK Tools & Android SDK Platform-tools 進行安裝或更新,這樣就會出現。另外一種就是它已經改名爲Local Maven repository for Support Libraries,打開即可看到:

這裏寫圖片描述

24.獲取屏幕像素,原先的通過WindowsManager來獲取屏幕像素已經廢棄:

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        int width = displayMetrics.widthPixels;
        int height = displayMetrics.heightPixels;

25.INSTALL_FAILED_DUPLICATE_PERMISSION

檢查手機是否連接正常;

根據列出了權限信息,查看是否寫了重複的權限;

查看是否有其它應用用了同樣的權限,將其卸載掉。

26.當我們查看一些官方控件源碼的時候,出現了這樣的情況:

這裏寫圖片描述

這個時候首先我們確定在SDK Manager裏已經下來了我們當前工程編譯版本的Source for Android SDK,
然後我們點擊Change Attached Source…,再點擊“external folder”,然後通過路徑“android-sdks/sources/android-xx”,選擇該文件夾即可。
打開參考鏈接

27.在做語言適配的時候,我們會建立不同的values-**文件夾來適配不同國家地區的語言,那麼這裏在我們平時的values文件夾裏雖然我們寫的strings值是中文,但這裏注意,其實這裏默認是英文,只是我們自己去做了處理而已。所以這就是爲什麼我們在這裏寫了中文,然後建立一個values-es去存放英文,然後切換爲英語地區,但還是顯示中文的原因。所以我們應該是去建立一箇中文文件夾:values-zh-rCN,然後寫上中文的值纔對。
Android應用多語言適配工作

28.使用RecyclerView的時候,出現了報錯的情況:

這裏寫圖片描述

其中的一個解決方法是如果你引用了v7的包,然後libs文件夾裏有v4的包,則要記得把v4刪掉。

29.查看自己apk或是jar的方法數,首先下載dex-method-counts.jar,然後CMD使用命令行:java -jar 路徑\dex-method-counts.jar 路徑*.jar(或是.apk),即會羅列出方法數。

這裏的前提是jar包已經被轉化爲dex,如果沒有轉化的話,在自己的SDK路徑 …\androidsdk\build-tools\xx.xx.xx下有個dx.bat,因此通過cmd進入到dx.bat所在的目錄下,然後通過命令dx --dex --output=輸出路徑*(名字可修改).jar 要轉化的jar包路徑*.jar。即可將原來的jar包轉化爲dex,然後再進行方法數的查看即可。

30.在用edittext做密碼輸入的時候,需要做可視與隱藏的切換,利用

et_input_password.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); //可視
et_input_password.setTransformationMethod(PasswordTransformationMethod.getInstance()); //隱藏

但在切換後出現光標回到初始位置,所以

 //切換後將EditText光標置於末尾
                CharSequence charSequence = et_input_password.getText();
                if (charSequence instanceof Spannable) {
                    Spannable spanText = (Spannable) charSequence;
                    Selection.setSelection(spanText, charSequence.length());
                }

31.TextInputLayout的兼容顯示問題。
TextInputLayout的空白顯示問題

32.進入某個有網絡數據請求的fragment的時候,由於網絡延遲,然後我們退出這個fragment,這個時候有一定的概率會發生閃退,提示如fragment not attach Activity之類的。有一個原因是因爲在這個時候我們用到了getResource之類的語句,我們可以將用到這語句的地方移到onStart生命週期裏去執行。

33.使用TextView的autolink=phone對電話號碼進行處理的時候,要考慮地區的問題,假如手機的語言從大陸切換到香港或是其它國家地區的時候,就會有些出現無法識別的情況。所以這裏就有一個細節的問題,如果我是設置爲點擊直接撥打,那麼該電話應該會出現無效的情況;如果是設置爲點擊打開撥打界面,這樣可能會好一點,用戶可以在撥打界面那裏修改電話號碼。

34.單純的ScrollView和WebView不要嵌套。

35.在聯繫recyclerview的時候,報了個這樣的錯誤:

The specified child already has a parent. You must call removeView() on the child’s parent first.

後來檢查的時候發現是在adpater的onCreateViewHolder裏關聯佈局的時候寫錯了:

  View view = LayoutInflater.from(mContext).inflate(mLayoutLd , parent );

應該改成:

  View view = LayoutInflater.from(mContext).inflate(mLayoutLd , parent , false);

36.在api 22 之後getResource被廢棄了,所以像類似的

img.setBackgroundColor(getResource().getColor(R.color.colorPrimary));

是行不通的,
應該改成

img.setBackgroundColor(ContextCompat.getColor(context , R.color.colorPrimary));

37.在跑程序的時候出現了手機上出現了兩個圖標,檢查下Manifest文件裏是否重複了

刪成一個即可。

38.Error inflating class android.support.design.widget.FloatingActionButton,當報出類似的錯誤時,要查看下是不是有些app的自定義屬性被寫成了android了,如:app:backgroundTint 而不是 android:backgroundTint

39.在使用LayoutParam的時候,

如果報出了錯誤: Caused by: android.view.WindowManagerInvalidDisplayException:Unabletoaddwindowandroid.view.ViewRootImplInvalidDisplayException: Unable to add window android.view.ViewRootImplW@3be0e7e – the specified window type is not valid,看下在初始化的時候:

 layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, 0, 0,PixelFormat.TRANSLUCENT);

這裏的第一個參數type是否被寫成了0,應該替換成WindowManager.LayoutParams.TYPE_SYSTEM_ERROR之類的有文字意義的。

40.在用TextView的佈局裏的時候,如果只想看下顯示效果,可以不用android:text來寫,用tools:text的話即可以在預覽的時候顯示文字,又可以在實際運行的時候不顯示。

41.用adb shell命令時提示more than one device/emulator。此時可以通過adb devices來查看有什麼設備,然後通過adb -s devicename shell來指定我們要的那個設備就行了。

42.用adb查詢數據庫裏表的內容時發生了中文亂碼的情況,此時可以重新打開cmd,然後輸入chcp 65001 然後回車。然後右擊窗口標題欄,選擇屬性——字體,將字體選擇爲Lucida Console,確定即可。這個時候再重新進入查看就發現中文不會出現亂碼了。

43.今天打開AS發現xml裏的代碼提示沒有,主要是出現在我的引用控件裏,我們依賴了一個控件Module,然後用了裏面一個控件MyScrollView,包括該控件下面的屬性以及其它控件都不能獲得代碼提示,原因是因爲我在開發的Module裏把compileSDKVersion給改成了23,而依賴的沒有改,我把依賴的Module也改成一樣的版本就可以了。

44.當對一些舊項目修改版本到23時,由於org.apache.http.client已經被廢棄了,但又不想修改,此時需要在libs裏添加jar包,該jar包可在自己的sdk文件路徑下的platforms/android-23/optional裏找到,名爲org.apache.http.legacy.jar。將其添加到libs裏重新編譯即可。

45.在android stuido裏當我們gradle編譯時間太長,然後我們想取消的時候,往往點擊stop沒有用。我們可以在當前項目目錄下的命令行裏輸入gradlew.bat --stop(或gradlew --stop)來停止,

46.build一個別人的項目的時候,出現了以下錯誤:

Execution failed for task ‘:app:mockableAndroidJar’.
java.util.zip.ZipException: invalid entry compressed size (expected 2051 but got 2050 bytes)

解決的方法是在project的build.gradle里加上:

allprojects {
    repositories {
        jcenter()
    }

    gradle.taskGraph.whenReady {
        tasks.each { task ->
            if (task.name.equals('mockableAndroidJar')) {
                task.enabled = false
            }
        }
    }
}

47.華爲手機打印不出日誌:
撥號鍵盤輸入

*#*#2846579#*#*

然後選擇ProhectMenu,然後後臺設置,然後LOG設置,LOG打開。

48.如果使用Recylerview設置wrap_content的時候沒有效果,嘗試看下是否更新到com.android.support:recyclerview-v7:23.2.1及以上。

49.使用drawerlayout的時候會由於側滑佈局裏不是listview而產生點擊穿透事件,即點擊側滑菜單的空白部分,其後面的佈局會發生事件響應,所以在側滑菜單的佈局裏設置android:clickable="true"即可解決。

50.使用Glide的時候,遇到CircleImageView的時候會出現加載不出來的情況,原因在於設置了佔位圖,可以將placeholder去掉,其它方法參考這裏:
Glide使用中的踩坑和填坑

51.使用butterknife的時候報錯:
duplicate entry: android/support/v4/hardware/display/DisplayManagerCompat$JellybeanMr1Impl.class
在build.gradle裏修改butterknife:

 compile ('com.jakewharton:butterknife:8.6.0'){
        exclude module: 'support-compat'
    }

52.隱式調用Service的時候會報錯,在5.0以上:

Intent intent = new Intent();
      intent.setAction("com.jdnew.serverapp.service.LicenseService");
        mContext.bindService(intent , mServiceConnection , Context.BIND_AUTO_CREATE);

需要加上包名即可:

Intent intent = new Intent();
        intent.setAction("com.jdnew.serverapp.service.LicenseService");
        intent.setPackage("com.jdnew.serverapp");
        mContext.bindService(intent , mServiceConnection , Context.BIND_AUTO_CREATE);

53.運行項目的時候報錯:

Cannot merge new index 67208 into a non-jumbo instruction.

在build.gradle裏添加如下代碼:

android{
 dexOptions {
        jumboMode = true
    }
}

54.獲取test\resources下的文件路徑

String filename = this.getClass().getClassLoader().getResource("dddd.pdf").getFile();
File file = new File(filename);

55.使用Android Studio下的Android Monitor可對真機操作進行錄屏:

這裏寫圖片描述

56.在AndroidTest裏處理關於運行時權限的問題,使用GrantPermissionRule

AndroidManifest.xml聲明需要的權限,然後引入GrantPermissionRule依賴。

androidTestCompile 'com.android.support.test:rules:1.0.2
    @Rule
    public GrantPermissionRule grantPermissionRule = GrantPermissionRule
            .grant(Manifest.permission.WRITE_EXTERNAL_STORAGE , Manifest.permission.READ_EXTERNAL_STORAGE);
  1. Android Studio Run/Debug configuration error: Module not specified
    把工程下 setting.gradle 裏的要運行的 app 的名稱刪除,然後在 File 裏進行 Sync,然後再把名字加回去,再 Sync

待續…

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