Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發技巧--Application, ListView排列,格式化浮點數,string.xml占位符,動態引用圖片

Android開發技巧--Application, ListView排列,格式化浮點數,string.xml占位符,動態引用圖片

編輯:關於Android編程

一. Application用途


1. Application用途

創建Application時機 : Application在啟動的時候會調用Application無參的構造方法創建實例;

Application構造方法 : Application的無參的構造方法必須是public的, 否則運行的時候會出現錯誤.

Application單例 : 在一個應用中, Application是單例的;

Application用途 : 所有的組件共享一個Application, 可以使用Application共享, 傳遞, 緩存數據;

Application用法 :

a. 組件間數據傳遞 : 組件之間傳遞數據的數據量比較大的時候, 盡量不要使用Intent附加域來傳遞, 可以將數據放在Application中, 以Application作為中轉站;

b. 下載數據 : 從網絡上下載的數據, 也可以暫時緩存到Application中, 如果下載的數據過多, 可以緩存到SD卡中;

c. 注意內存洩露 : Application是靜態的, 存放數據的時候注意聲明周期, 不要造成內存洩露;

2. 自定義Application技巧


在應用中經常用到自定義的Application, 自定義一個MyApplication, 將Application設置成單例, 並且在AndroidManifest.xml中注冊這個MyApplication;


(1)設置MyApplication單例

a. 定義私有 靜態 的MyApplication;

b. 設置一個公有的靜態方法, 將this 賦值給自定義的MyApplication對象;

c. 設置一個獲取MyApplication對象的方法, 該方法公共 靜態;

public class MyApplication extends Application {
	/*
	 * 單例模式 : 私有 靜態 本類的對象
	 */
	private static MyApplication mApplication;
	
	/*
	 * 單例模式 : 構造方法 , 注意 : Application的構造方法必須是public的
	 */
	public ReceiverApplication(){
		mApplication = this;
	}
	/*
	 * 單例模式 : 公共靜態獲取方法
	 */
	public static MyApplication getInstance() {
		return mApplication;
	}
}

這樣調用getInstance()方法, 就可以在任何類中調用Application了, 並能取到該類中的數據;


(2)在AndroidManifest.xml中注冊自定義的Application




    
        
    


(3)獲取Application方法

調用系統方法 : 在Activity中可以調用getApplicationContext()方法獲取Application;

通過自定義的方法 : 如我們上面自定義的Application那樣, 可以調用自定義的getInstance()方法獲取Application實例對象;



二. ListView中元素的排序

ListView中的元素排序, 即將數據源排序即可;

給集合排序的方法 : 調用Collections的sort(list, Comparator)方法, 該方法需要2個參數, 第一個參數就是需要排序的集合, 第二個參數是比較器;

這裡的比較器需要創建, 並且重寫其中的compare()方法, compare()方法返回1或者-1, 用此來控制排序的升序還是降序;

    Collections.sort(mList, new Comparator() {  
    	
        @Override  
        public int compare(Integer a, Integer b) {  
            if (a>b) {  
                return 1;  
            }  
            return -1;  
        }  
    });  

這樣就會將mList集合自動進行排序;



三. 格式化浮點數


如何在程序中保留一個float或者double浮點數的小數位數 , 這裡可以使用以下幾種方法 :

1.使用DecimalFormat格式化浮點數

首先創建一個DecimalFormat類 , 這個類可以按照一定的格式化數字來格式化浮點數. 常見的格式化字符是"#" , "0" . 創建該類的時候 , 將格式化的格式傳入 , 例如如果要保存兩位小數 , 就傳入 "#.00" , 以此類推 . 創建了DecimalFormat對象之後 , 調用該對象的format對象 , 將需要格式化的浮點數傳入這個方法 , 返回的結果就是格式化之後的固定位數的浮點數的字符串形式 . 注意 : 這種方法格式化之後的浮點數對象是字符串形式 , 如果之後需要使用這個浮點數進行計算 , 就需要使用BigDecimal進行實現的這種方法 ; 精確度問題 : DecimalFormat使用的是half-even捨入法, 這個不是四捨五入方法, 當出現5的時候,就會向最近的偶數靠近.

例如 : System.out.println(new java.text.DecimalFormat("0.00").format(3.135)); 5最近的偶數是4, 打印的結果就是3.14;

System.out.println(new java.text.DecimalFormat("0.00").format(3.125)); 5最近的偶數是2, 打印的結果就是3.12;

		float pi = 3.1415926f;
		DecimalFormat decimalFormat = new DecimalFormat("#.00");
		String formatData = decimalFormat.format(pi);
		System.out.println(formatData);
		
		System.out.println(new DecimalFormat("#.00").format(pi));

2.利用BigDecimal實現

創建一個BigDecimal對象 , 創建的時候 , 傳入需要格式化的浮點數 , new BigDecimal(float) ; 調用這個BigDecimal的setScale方法 , 這個方法傳入的參數 : 需要保留的小數位數 , BigDecimal.ROUND_HALF_UP常量 , 之後調用這個常量對應的將BigDecimal轉為浮點數的方法 , 得到的結果為轉化好的浮點數 .
		float pi = 3.1415926f;
		BigDecimal bigDecimal = new BigDecimal(pi);
		float result = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
		System.out.println(result);

與浮點數有關的構造方法 : 可以向構造方法中傳入浮點數 或者 字符串 , 這裡需要注意的是 , 使用浮點數的構造方法不精確 , 這個值最後會有不該有的數據,盡量使用字符串的構造方法. 例如 :
        BigDecimal bd1=new BigDecimal(0.05);
        System.out.println(bd1.toString());
        BigDecimal bd2=new BigDecimal("0.05");
        System.out.println(bd2.toString());
結果是 : 
        0.05000000000000000277555756156289135105907917022705078125
        0.05
因此使用字符串的構造函數,獲得的數據更精確.
BigDecimal的基本方法 : 加法 add , 減法 subtract, 乘法 multiply, divide 除法, setScale四捨五入.
加法計算 :
        BigDecimal bd3=new BigDecimal(String.valueOf(0.05));
        BigDecimal bd4=new BigDecimal(String.valueOf(0.01));
        System.out.println((bd3.add(bd4)).doubleValue());

減法計算 :
        BigDecimal bd5=new BigDecimal(String.valueOf(0.05));
        BigDecimal bd6=new BigDecimal(String.valueOf(0.01));
        System.out.println((bd5.subtract(bd6)).doubleValue());

乘法計算 :
        BigDecimal bd7=new BigDecimal(String.valueOf(0.05));
        BigDecimal bd8=new BigDecimal(String.valueOf(0.01));
        System.out.println((bd7.multiply(bd8)).doubleValue());

除法計算 :
        //這裡沒有考慮數據錯誤的可能情況
        //定義了精確位數
        int scale=10; 
        BigDecimal bd9=new BigDecimal(String.valueOf(0.05));
        BigDecimal bd10=new BigDecimal(String.valueOf(0.03));
        System.out.println((bd9.divide(bd10,scale,BigDecimal.ROUND_HALF_EVEN)).doubleValue()); 

四捨五入:
        //四捨五入
        scale=4;
        BigDecimal bd11=new BigDecimal(String.valueOf(3.1415926));
        System.out.println(bd11.setScale(scale,BigDecimal.ROUND_HALF_UP).toString());

四捨五入的精確模式 :
ROUND_CEILING : 向正無窮方向捨入 .
ROUND_DOWN : 向零方向捨入
ROUND_FLOOR : 向負無窮方向射捨入
ROUND_HALF_DOWN : 向距離近的一方捨入 , 如果兩邊相等 , 向下捨入 , 例如 2.155 , 保留2位小數的話 是 2.15;
ROUND_HALF_UP : 向距離近的一方捨入 , 如果兩邊相等 , 向上捨入 , 例如 2.155,保留兩位小數的話 是 2.16; 這個就是四捨五入
ROUND_HALF_EVEN : 向距離近的一方捨入 , 如果兩邊距離相等 , 如果保留位是奇數位 使用ROUND_HALF_UP , 如果保留位是偶數位,使用ROUND_HALF_DOWN; ROUND_UNNECESSARY : 精確的計算 , 不需要捨入 .
ROUND_UP : 向遠離0的方向捨入.

四. string.xml占位符




開發中經常遇到這樣的情況 , 在string.xml中用到以下占位符
刪除%1$s成功 
%1$s上傳到%2$s成功

1.xliff:g標簽

http://blog.csdn.net/hustpzb/article/details/6870817

http://blog.csdn.net/ganggang1st/article/details/6804086

五. 動態引用圖片



在資源文件中存放有 image_1.png, image_2.png, image_3.png 三張圖片 , 根據傳入參數動態引用對應的圖片 , 有三個解決方法

根據R.drawable.xx動態引用是錯誤的 , 因為每個這種id都對應著R文件中的一個id,如果沒有相對應的id , 編譯不會通過;

建立一個工程,包名為com.yun.demo

方案一 : 圖片放在drawable目錄下的情況

Resources resources = this.getResources();
int imageIndentify = resources.getIdentifier(imageName, "drawable","chao.yun.demo");
使用上面的代碼可以通過字符串拼接圖片名稱 , 根據傳入的參數 , 拼接imageName字符串 , 從而動態的獲取圖片對應的id;
resources.getIdentifier(imageName, "drawable","chao.yun.demo");
這個方法返回的是圖片對應的id ; 第一個參數是圖片的名稱 , 如果沒有找到 , 返回0 ; 第二個參數是默認的資源類型 , 如果找的是圖片 , 就是 "drawable" , 這個不是具體的目錄 , 因此不用注明"drawable-hdpi" 第三個參數是包名 , 這個包名是創建工程時候的包名 , 是總的包名 , 與manifest配置文件中的包名相同;
詳細代碼 : layout中的代碼 :


    
    
    
    
    
    

activity代碼 :
public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        LinearLayout ll_1 = (LinearLayout) findViewById(R.id.ll_1);
        LinearLayout ll_2 = (LinearLayout) findViewById(R.id.ll_2);
        LinearLayout ll_3 = (LinearLayout) findViewById(R.id.ll_3);
        
        Resources resources = this.getResources();

	String imageName = "image_" + 1;
	int imageIndentify = resources.getIdentifier(imageName, "drawable","chao.yun.demo");
	ll_1.setBackgroundResource(imageIndentify);

	imageName = "image_" + 2;
	imageIndentify = resources.getIdentifier(imageName, "drawable","chao.yun.demo");
	ll_2.setBackgroundResource(imageIndentify);

	imageName = "image_" + 3;
	imageIndentify = resources.getIdentifier(imageName, "drawable","chao.yun.demo");
	ll_3.setBackgroundResource(imageIndentify);
    }
}
效果圖 :



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved