Android細節問題總結(一)

這篇博客是用來記錄本身在寫代碼的過程當中遇到的一些問題,以及解決方法,作一個總結,算是筆記吧。html


1.問題描述:java

Listview中adapter的刷新(notifyDataSetChanged())數據忽然消失問題.

解決方法:android

咱們的adapter中的一個List<T>參數,而在調用adapter的一層(即adapter的上一層)對List<T>進行賦值操做,而不是t.add(T)或是t.remove(T)這樣的操做時,咱們在adapter.notifyDataSetChanged();的時候就會出現數據所有清空了。這是由於咱們對傳入adapter的參數進行了一個全體賦值,而List<T>參數中那些未被修改的數據也同樣被從新修改(即便數據是同樣的,可實際上對象已經發生了變化)。算法


2.問題描述:緩存

Listview中adapter的刷新(notifyDataSetChanged())ListView仍是沒有任何變化問題.

解決方法:app

這種狀況通常出如今咱們對List<T>的數據要進行一個批量的操做的時候。例如:eclipse

for (int i = mPositions.size() - 1; i >= 0; i--) {
			mPackageInfos.remove((int)mPositions.get(i));
			mAdapter.notifyDataSetChanged();
		}

你們能夠看到我這邊是從後往前進行remove的,這是爲了防止先remove了前面的,整個List<T>向前推了一個單位,這樣勢必會出現錯位。倒序刪除是一種比較廣泛的刪除算法。

還有一件事情須要注意:t.remove(positicaion)這樣的操做中的positication是int型的,不能是Integer這種類型的。ide


3.問題描述:佈局

EditText得到焦點時,擠壓屏幕問題.

當咱們點擊某一Activity中的EditText時,咱們的某些控件會被擠壓。若是你不是使用比例來控制佈局,那麼你的運氣很好,多是看不到控件被擠壓。通常來講若是你的一些控件是用的百分比來控制,那麼你的控件頗有可能就會出現被擠壓得很扁。ui

解決方法:

你的Manifest.xml文件能夠這樣來寫:

<activity android:name="com.xxxx.xxxActivity"
            android:windowSoftInputMode="adjustPan" />


4.問題描述:

對Eclipse中使用4個空格來替換一個Tab鍵的設置方法.

解決方法:

第一步:

點擊 window->preference,依次選擇 General->Editors->Text Editors,選中右側的 insert space for tabs。保存

第二步:

1. Window --> Java --> Code Style --> Formatter --> 選擇右側的Edit --> 

2. 輸入自定義的Profile name

3. 在下方的Tab policy的右側的下拉列表中選擇Spaces only

4. 輸入Indentation size和Tab size的大小均爲4

5. 點擊OK

6. 重啓Eclipse


5.問題描述:

在控制檯啓動和關閉ADB服務.

解決方法:

開啓:adb start-server

關閉:adb kill-server

通常來講,咱們必須先在控制檯輸入關閉服務再輸入開啓服務。是爲了不以前內存中殘留的adb服務干擾。


6.問題描述:

將兩個一位或兩位數顯示成00:00格式.

解決方法:

String.format("%02d", hour) + ":" + String.format("%02d", minute);


7. 問題描述:

如何控制橫豎屏切換

經過在AndroidManifest.xml中設置activity中的android:screenOrientation屬性值來實現.
android:screenOrientation屬性,有如下參數可選:
"unspecified":默認值 由系統來判斷顯示方向.斷定的策略是和設備相關的,因此不一樣的設備會有不一樣的顯示方向.
"landscape":橫屏顯示
"portrait":豎屏顯示
"user":用戶當前首選的方向
"behind":和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
"sensor":由物理的感應器來決定。若是用戶旋轉設備這屏幕會橫豎屏切換。
"nosensor":忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了("unspecified"設置除外).


示例 — AndroidManifest.xml中實現:

android:screenOrientation="portrait"
示例 — Java代碼實現:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


8.問題描述:

Java/Android中截取從a到b的子字符串

String subString = str.substring(a, b);


9.問題描述:

SQLite中多級ORDER BY的使用.

SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;


10.問題描述:

判斷當前是否爲Wi-Fi狀態

解決方案:

public static boolean isWifiNetwork(Context context) {
	    boolean isWifi = false;
	    Context getContext = context.getApplicationContext();  
	    ConnectivityManager connectivity = (ConnectivityManager) getContext
	            .getSystemService(Context.CONNECTIVITY_SERVICE);
	    NetworkInfo[] info = null;
	    if (connectivity != null) {
	        info = connectivity.getAllNetworkInfo();
	        if (info != null) {
	            for (int i = 0; i < info.length; i++) {
	                if (info[i].getTypeName().equals("WIFI") && info[i].isConnected()) {
	                    isWifi = true;
	                    break;
	                }
	            }
	        }
	    }
	    getContext = null;
        connectivity = null;
        info = null;
        
	    return isWifi;
	}

11.問題描述:

JNI開發時,Unresolved inclusion

我在.c和.h文件中使用#include <jni.h>時,出現了Unresolved inclusion: <jni.h>的報錯信息。
解決方案:
緣由是在eclipse編輯環境中沒有找到對應的include中的文件。解決方法是將包含該文件的include目錄做爲新的linked folder加入工程中。具體方法以下:
1. 右擊工程->New->Folder
2. 對話框中點擊Advanced
3. 選擇Link to alternate location (Linked Folder),選擇須要的include目錄
4. Finish後刷新工程,問題解決。


12.問題描述:

Android寫文件,換行

注意,這裏說的不是在TextView上顯示的文本信息,而是在向文本文件中寫數據時的換行。這裏使用的是"\r\n",以下:

String str = "ABC";  
str += "\r\n";

13.問題描述:

動態保持當前屏幕的橫豎屏狀態

    這裏不一樣設置橫豎的地方就在於保持的前提,前提是咱們要知道當前屏幕是處於哪一種狀態。這種需求通常出如今咱們在一個沒有限制橫豎屏的Activity中進行彈框。在彈框的過程當中若是咱們進行橫豎屏切換,那問題就來了。你能夠寫一個小的Demo來觀察一下橫豎屏切換的時候,當前Activity的生命週期,那麼答案就不言而喻了。因此咱們要先捕獲屏幕狀態,再去設置當前屏幕的相應狀態。關鍵代碼以下:

int screenState = MainActivity.this.getResources().getConfiguration().orientation;
				if (screenState == Configuration.ORIENTATION_LANDSCAPE){
					MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
				} else if (screenState ==Configuration.ORIENTATION_PORTRAIT) {
					MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
				}

14. 問題描述:

得到鍵盤高度

    當咱們要去獲知鍵盤是否被打開,有時不是直接去用一個方法得到鍵盤是否被打開。例如咱們能夠得到當前鍵盤的高度,若是超過必定值就認爲被打開了。說到這裏,可能你又會說,那若是鍵盤沒有被打開那還怎麼得到鍵盤的高度呢?這裏就要再作一次迂迴,計算鍵盤以上控件的高度。由於咱們知道當鍵盤打開後,若是咱們設置了當前Activity爲擠壓屏幕屬性,鍵盤就會把Activity的根Layout進行擠壓,高度會變小,不過屏幕的高度不會變。說到這兒,相信你們也都知道該怎麼作了吧。下面時關鍵代碼:

/**
 * 用於得到鍵盤的高度
 */
rootView.getViewTreeObserver().addOnGlobalLayoutListener(
	new ViewTreeObserver.OnGlobalLayoutListener() {
	
	@Override
	public void onGlobalLayout() {
                      
		Rect r = new Rect();
		rootView.getWindowVisibleDisplayFrame(r);

		int screenHeight = rootView.getRootView().getHeight();
		int KeyboardHeigth = screenHeight - (r.bottom - r.top);
	}
});


15.問題描述:

得到平板序列號

若是要用一串惟一標識設備的字符串,在手機上相信你們首先想到的可能就是IMEI。不過對於通常的手機來講,這一點恐怕就很難實現了。由於通常來講,平板中不安裝SIM卡,因此平板中是沒有分配IMEI號碼的。固然,也有一些平板中就有,華爲就是。

解決方案:

public static String getSerialNumber() {
    returnandroid.os.Build.SERIAL;
}


16.問題描述:

替換圖標後運行程序圖標沒有被替換

解決方案:

遇到這種狀況通常來講就是你沒有替換掉全部分辨率下的圖標,這時只須要從新替換掉全部圖標便可。不過今天我也遇到了替換圖標失效的問題,我項目中全部分辨率下的圖標均已替換,但是仍是不行。原來是由於咱們的手機會有一個緩存機制,它保存了咱們原來的那個圖標,無論你怎麼替換確定都是不行的。如今你要麼是等,要麼是換一臺機器試試。


17.問題描述:

動態限制EditText最長輸入的字符長度

解決方案:

imgSizeEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(3)});


18.問題描述:

動態設置EditText光標位置

解決方案:

imgNameEditText.setSelection(32); // 設置光標的位置


19.問題描述 :

動態得到控件的寬和高

解決方案:

就拿RelativeLayout來講明一下吧

RelativeLayout mShowLayout = (RelativeLayout) findViewById(R.id.main_relative_layout);
mShowLayout.measure(0, 0);
Toast.makeText(this, "w = " + mShowLayout.getMeasuredWidth() + ", h = " + mShowLayout.getMeasuredHeight(),  0).show();


20.問題描述:

格式化日期,出現未被格式化的內容(如:1997-01-01 HH:12:00)

出現上述問題的緣由多是由於咱們使用下面這樣的語句來格式化咱們的日期文本
textView.setText(DateFormat.format("yyyy-MM-dd HH:mm:ss", System.currentTimeMillis()).toString());
解決方案:
SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
textView.setText(sDateFormat.format(new Date(System.currentTimeMillis())));


筆者最新開發的應用鏈接

http://zhushou.360.cn/detail/index/soft_id/2419729?recrefer=SE_D_%E6%A3%B1%E9%95%9C

http://www.wandoujia.com/apps/com.mastershield.personalstat

相關文章
相關標籤/搜索