您当前的位置: 首页 >  android

韩曙亮

暂无认证

  • 2浏览

    0关注

    1068博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片

韩曙亮 发布时间:2013-12-21 20:40:55 ,浏览量:2

一. 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);
    }
}
效果图 :
六. Android 自带图标库
Android™ 2.1 android.R.drawable Icon Resources
  • Android™ 1.5 android.R.drawable Icon Resources
  • Android™ 1.6 android.R.drawable Icon Resources
  • Android™ 2.1 android.R.drawable Icon Resources
  • Originated from: http://www.darshancomputing.com/android/1.5-drawables.html

This is a list of resources in Android 2.1's android.R.drawable that might be useful as icons in your Android applications. You can use them like this:

Java Usage example:
myMenuItem.setIcon(android.R.drawable.ic_menu_save);
Resource Usage example:
android:icon="@android:drawable/ic_menu_save"
alert_dark_framealert_dark_framealert_light_framealert_light_framearrow_down_floatarrow_down_floatarrow_up_floatarrow_up_floatbottom_barbottom_barbtn_defaultbtn_defaultbtn_default_smallbtn_default_smallbtn_dialogbtn_dialogbtn_dropdownbtn_dropdownbtn_minusbtn_minusbtn_plusbtn_plusbtn_radiobtn_radiobtn_starbtn_starbtn_star_big_offbtn_star_big_offbtn_star_big_onbtn_star_big_onbutton_onoff_indicator_offbutton_onoff_indicator_offbutton_onoff_indicator_onbutton_onoff_indicator_oncheckbox_off_backgroundcheckbox_off_backgroundcheckbox_on_backgroundcheckbox_on_backgrounddark_headerdark_headerdialog_framedialog_framedivider_horizontal_brightdivider_horizontal_brightdivider_horizontal_darkdivider_horizontal_darkdivider_horizontal_dim_darkdivider_horizontal_dim_darkdivider_horizontal_textfielddivider_horizontal_textfieldedit_textedit_texteditbox_backgroundeditbox_backgroundeditbox_background_normaleditbox_background_normaleditbox_dropdown_dark_frameeditbox_dropdown_dark_frameeditbox_dropdown_light_frameeditbox_dropdown_light_framegallery_thumbgallery_thumbic_btn_speak_nowic_btn_speak_nowic_deleteic_deleteic_dialog_alertic_dialog_alertic_dialog_dialeric_dialog_dialeric_dialog_emailic_dialog_emailic_dialog_infoic_dialog_infoic_dialog_mapic_dialog_mapic_input_addic_input_addic_input_deleteic_input_deleteic_input_getic_input_getic_lock_idle_alarmic_lock_idle_alarmic_lock_idle_chargingic_lock_idle_chargingic_lock_idle_lockic_lock_idle_lockic_lock_idle_low_batteryic_lock_idle_low_batteryic_lock_lockic_lock_lockic_lock_power_offic_lock_power_offic_lock_silent_modeic_lock_silent_modeic_lock_silent_mode_offic_lock_silent_mode_offic_media_ffic_media_ffic_media_nextic_media_nextic_media_pauseic_media_pauseic_media_playic_media_playic_media_previousic_media_previousic_media_rewic_media_rewic_menu_addic_menu_addic_menu_agendaic_menu_agendaic_menu_always_landscape_portraitic_menu_always_landscape_portraitic_menu_callic_menu_callic_menu_cameraic_menu_cameraic_menu_close_clear_cancelic_menu_close_clear_cancelic_menu_compassic_menu_compassic_menu_cropic_menu_cropic_menu_dayic_menu_dayic_menu_deleteic_menu_deleteic_menu_directionsic_menu_directionsic_menu_editic_menu_editic_menu_galleryic_menu_galleryic_menu_helpic_menu_helpic_menu_info_detailsic_menu_info_detailsic_menu_manageic_menu_manageic_menu_mapmodeic_menu_mapmodeic_menu_monthic_menu_monthic_menu_moreic_menu_moreic_menu_my_calendaric_menu_my_calendaric_menu_mylocationic_menu_mylocationic_menu_myplacesic_menu_myplacesic_menu_preferencesic_menu_preferencesic_menu_recent_historyic_menu_recent_historyic_menu_report_imageic_menu_report_imageic_menu_revertic_menu_revertic_menu_rotateic_menu_rotateic_menu_saveic_menu_saveic_menu_searchic_menu_searchic_menu_sendic_menu_sendic_menu_set_asic_menu_set_asic_menu_shareic_menu_shareic_menu_slideshowic_menu_slideshowic_menu_sort_alphabeticallyic_menu_sort_alphabeticallyic_menu_sort_by_sizeic_menu_sort_by_sizeic_menu_todayic_menu_todayic_menu_uploadic_menu_uploadic_menu_upload_you_tubeic_menu_upload_you_tubeic_menu_viewic_menu_viewic_menu_weekic_menu_weekic_menu_zoomic_menu_zoomic_notification_clear_allic_notification_clear_allic_notification_overlayic_notification_overlayic_partial_secureic_partial_secureic_popup_disk_fullic_popup_disk_fullic_popup_reminderic_popup_reminderic_popup_syncic_popup_syncic_search_category_defaultic_search_category_defaultic_secureic_securemenu_framemenu_framemenu_full_framemenu_full_framepicture_framepicture_framepresence_awaypresence_awaypresence_busypresence_busypresence_invisiblepresence_invisiblepresence_offlinepresence_offlinepresence_onlinepresence_onlineprogress_indeterminate_horizontalprogress_indeterminate_horizontalradiobutton_off_backgroundradiobutton_off_backgroundradiobutton_on_backgroundradiobutton_on_backgroundspinner_backgroundspinner_backgroundspinner_dropdown_backgroundspinner_dropdown_backgroundstar_big_offstar_big_offstar_big_onstar_big_onstar_offstar_offstar_onstar_onstat_notify_call_mutestat_notify_call_mutestat_notify_chatstat_notify_chatstat_notify_errorstat_notify_errorstat_notify_missed_callstat_notify_missed_callstat_notify_morestat_notify_morestat_notify_sdcardstat_notify_sdcardstat_notify_sdcard_preparestat_notify_sdcard_preparestat_notify_sdcard_usbstat_notify_sdcard_usbstat_notify_syncstat_notify_syncstat_notify_sync_noanimstat_notify_sync_noanimstat_notify_voicemailstat_notify_voicemailstat_sys_data_bluetoothstat_sys_data_bluetoothstat_sys_downloadstat_sys_downloadstat_sys_download_donestat_sys_download_donestat_sys_headsetstat_sys_headsetstat_sys_phone_callstat_sys_phone_callstat_sys_phone_call_forwardstat_sys_phone_call_forwardstat_sys_phone_call_on_holdstat_sys_phone_call_on_holdstat_sys_speakerphonestat_sys_speakerphonestat_sys_uploadstat_sys_uploadstat_sys_upload_donestat_sys_upload_donestat_sys_vp_phone_callstat_sys_vp_phone_callstat_sys_vp_phone_call_on_holdstat_sys_vp_phone_call_on_holdstat_sys_warningstat_sys_warningstatus_bar_item_app_backgroundstatus_bar_item_app_backgroundstatus_bar_item_backgroundstatus_bar_item_backgroundsym_action_callsym_action_callsym_action_chatsym_action_chatsym_action_emailsym_action_emailsym_call_incomingsym_call_incomingsym_call_missedsym_call_missedsym_call_outgoingsym_call_outgoingsym_contact_cardsym_contact_cardsym_def_app_iconsym_def_app_icontitle_bartitle_bartitle_bar_talltitle_bar_talltoast_frametoast_framezoom_platezoom_plate

转载

http://docs.since2006.com/android/2.1-drawables.php

七  Android 不显示标题栏和全屏的设置方法

1.在Manifest.xml中设置

不显示标题栏android:theme="@android:style/Theme.NoTitleBar"全屏android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

2.在代码中实现this.requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

关注
打赏
1663594092
查看更多评论
立即登录/注册

微信扫码登录

0.0425s