Android小知識清單(二)

1、Toast的另一種用法

    Toast我們通常用來提示文字,但是也可以用來顯示整個View來顯示,如下:

				Toast toast = new Toast(getApplicationContext());
				toast.setGravity(Gravity.FILL, 0, 0);
				toast.setView(toastView);
				toast.show();

2、自定義View時的初始化操作

    自定義View的時候典型的就是畫筆初始化,包括Paint創建和顏色、粗細等屬性設置什麼的一般只需要在第一次創建初始化就好,通常就是在構造器中初始化,不要在onDraw中去構造,因爲很多情況下onDraw會被多次執行,比如調用了invalidate方法。

3、Adapter數據變化時我們如何監聽?

    有時候當Adapter或者Cursor的數據有變化時我們需要作一些操作該怎麼辦?我們可以使用DataSetObserver觀察者模式來實現監聽。繼承DataSetObserver此類重寫onChanged()和onInvalidated()方法,然後用mAdapter來registerDataSetObserver(···)即可。當然,也只有當調用了mAdapter.notifyDataSetChanged();後我們的觀察者才知道數據變化了,纔會執行onCHanged()。

4、在將class文件編譯爲h頭文件時的一些問題。

   (1)通常情況下我們在編譯的時候直接用javah即可:javah com.geo.bitmap.BitmapHelper

   (2)有時候會出現Android SDK的系統類找不到的情況:找不到類android.graphics.Bitmap。這時候我們就需要這樣的命令javah -d jni -classpath E:\adt\sdk\platforms\android-17\android.jar; com.geo.bitmap.BitmapHelper,一定要注意在android.jar後面除了有一個分後還有一個空格!

5、關於app在打包時的一些事情

   我們在開發好Android應用後,打包運行的時候,SDK是不會打入apk中的,apk在手機或其它設備上運行的時候會使用手機等設備rom的sdk,比如,不管我們開發打包用的SDK是4.4的,還是4.0的打包,如果運行在2.3的手機上,調用的就是2.3的api。

6、關於TextView文本內容過長的問題。

    有時候TextView需要把很長的文本內容顯示出來,會出現最後一行文本被截斷不顯示。解決方法是在此TextView中加上android:gravity="bottom",如果還不行就試試top?

7、TextView的屬性導致ListView的onItemClick()單擊事件無效!

    在ListView的item佈局中對TextView設置了一個textIsSelectable=true屬性,結果就導致了ListView的單擊事件不響應!那個屬性是TextView粘貼複製效果的,目前我的解決方案是去掉該屬性,暫時不知道爲何會影響到ListView的onItemClick()事件的回調,有待調查!

8、關於應用在後臺執行被系統回收的問題。

    今天測試同事提出的bug說我們的應用在登陸成功後按home鍵然後使用其它app,過一會再進入我們的app就發現又需要登錄!初步懷疑是我們的應用被系統清理回收了,由於內存不足和耗電量高,於是就先讓客戶在設置裏將應用設置爲受保護的後臺應用,也就是不讓系統清理我哦們的應用,。關於內存的檢測看:http://stackoverflow.com/questions/2298208/how-do-i-discover-memory-usage-of-my-application-in-android/2299813#2299813

9、Sqlite在插入時返回-1

   今天在數據庫insert()操作的時候老是返回-1值,表明一直插入失敗,後來調查發現實因爲在創建表的時候有個語句是這樣寫的:nid varchar primary key。其中nid是我表的一個字段,Sqlite數據庫會將integer primary key的語句解析爲自動增長,由於此nid是varchar且我在插入的時候還給nid賦值了,所以出錯,可以將varchar改爲integer類型,再插入時讓它自動增長。這是語句是失誤了!。

10、使用Service防止在低內存時應用被kill。

    我們可以在Service的onCreate()中調用this.startForeground(100, notification);然後在onDestory()中調用stopForeground(boolnean)就可以讓我們的服務在前臺運行了。

11、如何根據Graphic的範圍獲取中心點?(ArcGIS)

Point point = GeometryEngine.getLabelPointForPolygon((Polygon) graphic.getGeometry(), mMapView.getSpatialReference());

12、應用在啓動時會白一下然後在進入引導界面解決

   其實這是因爲在應用啓動時Window的背景,我們在樣式中去掉這個背景,即讓他透明即可。

 <style name="AppTheme" parent="AppBaseTheme">  
        <item name="android:windowBackground">@android:color/transparent</item>  
        <item name="android:windowNoTitle">true</item>  
    </style>  

13、Toolbar在4.4系統上顯示正常,但是在5.0+上Toolbar會和狀態欄重疊

   解決辦法,加上android:fitsSystemWindows=“true”還是不起作用,後來把根佈局CoordinatorLayout換成線性佈局就可以了,所以,記得以後不要用CoordinatorLayout佈局,雖然這是一個ViewGroup,但是其內部原理還不是很清楚。


14、在AndroidStudio中,使用ImageLoader出現ClassNotDefFoundError錯誤,後來發現時由於使用了分包,但是又是自己定義的Application,所以重寫以下代碼就解決了:

 @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

15、AndroidStudio運行項目得好長時間,而且出現OOM,如下:java.lang.OutOfMemoryError: GC overhead limit exceeded,解決辦法就是在app的gralde的android{}模塊添加如下代碼:

dexOptions {
        javaMaxHeapSize "4g"
    }

16、使用AndroidStudio將一個Module打包成jar包

首先在Module的gralde中編寫:

task makeJar(type: Copy) {
        delete 'build/libs/mpchart.jar'
        from('build/intermediates/bundles/release/')
        into('build/libs/')
        include('classes.jar')
        rename ('classes.jar', 'mpchart.jar')
    }

    makeJar.dependsOn(build)

  然後打開AS的Terminal執行gradlew makeJar命令即可。


17、在Android 7.0上,ClassNotFound奇葩異常

明明已經註冊了Activity,但是還是報找不到類,後來發現是註冊的時候有兩個一樣的label值,導致找不到類。


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