Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
一. 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
<manifest xmlns:android="http://schemas.android.com/apk/res/android" > <application android:name=".MyApplication" > </application> </manifest>
(3)获取Application方法
调用系统方法: 在Activity中可以调用getApplicationContext()方法获取Application;
通过自定义的方法: 如我们上面自定义的Application那样, 可以调用自定义的getInstance()方法获取Application实例对象;
二. ListView中元素的排序
ListView中的元素排序, 即将数据源排序即可;
给集合排序的方法 : 调用Collections的sort(list, Comparator)方法, 该方法需要2个参数, 第一个参数就是需要排序的集合, 第二个参数是比较器;
这里的比较器需要创建, 并且重写其中的compare()方法, compare()方法返回1或者-1, 用此来控制排序的升序还是降序;
Collections.sort(mList, new Comparator<Integer>() { @Override public int compare(Integer a, Integer b) { if (a>b) { return 1; } return -1; } });
这样就会将mList集合自动进行排序;
三. 格式化浮点数
如何在程序中保留一个float或者double浮点数的小数位数 , 这里可以使用以下几种方法 :
1.使用DecimalFormat格式化浮点数
例如 : 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实现
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 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中用到以下占位符
<string name="delete_success">删除<xliff:g id="name">%1$s</xliff:g>成功</string>
<string name="upload_success">%1$s上传到%2$s成功</string>
1.xliff:g标签
五. 动态引用图片
在资源文件中存放有 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 ;
详细代码 :
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/ll_1" android:layout_width="fill_parent" android:layout_height="0px" android:layout_weight="1"></LinearLayout> <LinearLayout android:id="@+id/ll_2" android:layout_width="fill_parent" android:layout_height="0px" android:layout_weight="1"></LinearLayout> <LinearLayout android:id="@+id/ll_3" android:layout_width="fill_parent" android:layout_height="0px" android:layout_weight="1"></LinearLayout> </LinearLayout>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'sandroid.R.drawable
that might be useful as icons in your Android applications. You can use them like this:
myMenuItem.setIcon(android.R.drawable.ic_menu_save);
android:icon="@android:drawable/ic_menu_save"
alert_dark_frame
|
alert_light_frame
|
arrow_down_float
|
arrow_up_float
|
bottom_bar
|
btn_default
|
btn_default_small
|
btn_dialog
|
btn_dropdown
|
btn_minus
|
btn_plus
|
btn_radio
|
btn_star
|
btn_star_big_off
|
btn_star_big_on
|
button_onoff_indicator_off
|
button_onoff_indicator_on
|
checkbox_off_background
|
checkbox_on_background
|
dark_header
|
dialog_frame
|
divider_horizontal_bright
|
divider_horizontal_dark
|
divider_horizontal_dim_dark
|
divider_horizontal_textfield
|
edit_text
|
editbox_background
|
editbox_background_normal
|
editbox_dropdown_dark_frame
|
editbox_dropdown_light_frame
|
gallery_thumb
|
ic_btn_speak_now
|
ic_delete
|
ic_dialog_alert
|
ic_dialog_dialer
|
ic_dialog_email
|
ic_dialog_info
|
ic_dialog_map
|
ic_input_add
|
ic_input_delete
|
ic_input_get
|
ic_lock_idle_alarm
|
ic_lock_idle_charging
|
ic_lock_idle_lock
|
ic_lock_idle_low_battery
|
ic_lock_lock
|
ic_lock_power_off
|
ic_lock_silent_mode
|
ic_lock_silent_mode_off
|
ic_media_ff
|
ic_media_next
|
ic_media_pause
|
ic_media_play
|
ic_media_previous
|
ic_media_rew
|
ic_menu_add
|
ic_menu_agenda
|
ic_menu_always_landscape_portrait
|
ic_menu_call
|
ic_menu_camera
|
ic_menu_close_clear_cancel
|
ic_menu_compass
|
ic_menu_crop
|
ic_menu_day
|
ic_menu_delete
|
ic_menu_directions
|
ic_menu_edit
|
ic_menu_gallery
|
ic_menu_help
|
ic_menu_info_details
|
ic_menu_manage
|
ic_menu_mapmode
|
ic_menu_month
|
ic_menu_more
|
ic_menu_my_calendar
|
ic_menu_mylocation
|
ic_menu_myplaces
|
ic_menu_preferences
|
ic_menu_recent_history
|
ic_menu_report_image
|
ic_menu_revert
|
ic_menu_rotate
|
ic_menu_save
|
ic_menu_search
|
ic_menu_send
|
ic_menu_set_as
|
ic_menu_share
|
ic_menu_slideshow
|
ic_menu_sort_alphabetically
|
ic_menu_sort_by_size
|
ic_menu_today
|
ic_menu_upload
|
ic_menu_upload_you_tube
|
ic_menu_view
|
ic_menu_week
|
ic_menu_zoom
|
ic_notification_clear_all
|
ic_notification_overlay
|
ic_partial_secure
|
ic_popup_disk_full
|
ic_popup_reminder
|
ic_popup_sync
|
ic_search_category_default
|
ic_secure
|
menu_frame
|
menu_full_frame
|
picture_frame
|
presence_away
|
presence_busy
|
presence_invisible
|
presence_offline
|
presence_online
|
progress_indeterminate_horizontal
|
radiobutton_off_background
|
radiobutton_on_background
|
spinner_background
|
spinner_dropdown_background
|
star_big_off
|
star_big_on
|
star_off
|
star_on
|
stat_notify_call_mute
|
stat_notify_chat
|
stat_notify_error
|
stat_notify_missed_call
|
stat_notify_more
|
stat_notify_sdcard
|
stat_notify_sdcard_prepare
|
stat_notify_sdcard_usb
|
stat_notify_sync
|
stat_notify_sync_noanim
|
stat_notify_voicemail
|
stat_sys_data_bluetooth
|
stat_sys_download
|
stat_sys_download_done
|
stat_sys_headset
|
stat_sys_phone_call
|
stat_sys_phone_call_forward
|
stat_sys_phone_call_on_hold
|
stat_sys_speakerphone
|
stat_sys_upload
|
stat_sys_upload_done
|
stat_sys_vp_phone_call
|
stat_sys_vp_phone_call_on_hold
|
stat_sys_warning
|
status_bar_item_app_background
|
status_bar_item_background
|
sym_action_call
|
sym_action_chat
|
sym_action_email
|
sym_call_incoming
|
sym_call_missed
|
sym_call_outgoing
|
sym_contact_card
|
sym_def_app_icon
|
title_bar
|
title_bar_tall
|
toast_frame
|
zoom_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);
相关推荐
在Android应用开发中,ListView是常用的控件,用于展示大量数据列表。然而,为了提供更好的用户体验,许多应用都需要实现ListView的下拉刷新功能,让用户能够即时获取最新的数据。本示例"Android--开发-- ListView...
在IT行业中,ListView是Android开发中常用的一种控件,它用于显示一列可滚动的数据项。右键菜单(上下文菜单)则是用户交互中的一个重要功能,可以为用户提供更多的操作选项。`String.format`方法则是Java语言中用于...
在Android开发中,ListView和GridView是两种非常重要的布局控件,尤其在展示大量数据时,它们提供了高效且可滚动的视图。以下是关于这两个控件及其相关知识点的详细说明: 1. **ListView**: - ListView是Android ...
在Android开发中,下拉刷新(Pull-to-Refresh)功能是一种常见的用户交互设计,它允许用户通过在列表顶部向下拉动来加载更多数据或更新现有内容。`android-pulltorefresh-listview`是一个专为ListView实现下拉刷新...
本篇文章将深入剖析`drag-sort-listview-master`这个源码项目,揭示其工作原理,并提供实用的开发技巧。 首先,我们需要理解Drag-Sort-Listview的核心概念。它主要由两部分组成:拖动(Drag)和排序(Sort)。拖动是指...
很好的Delphi Firemonkey控件,可用作Android、iOS、MacOS、Windows开发,比Delphi自带的listview更好用、功能更强大! ListView1.SetColorItemSelected(TAlphaColorRec.Orangered); ListView1.SetColorItemFill...
Android-仿iphone的listview下拉更新(源码).zip
在Android应用开发中,ListView是常用的视图组件,用于展示大量的数据列表。为了提供更丰富的交互体验,开发者经常需要自定义ListView,实现如滑动删除Item等高级功能。本篇文章将详细讲解如何在Android中通过自定义...
在Android开发中,ListView是用于显示可滚动列表的视图组件,经常被用来展示大量数据。SimpleAdapter是Android提供的一种简单易用的适配器,它可以帮助开发者将数据集(如数组或列表)绑定到ListView上,使得数据...
由于Android设备的碎片化,不同设备可能运行着不同的Android版本。v4库确保了开发者可以使用新API而不用担心在旧版本系统上运行的应用程序出现兼容性问题。 **2. 类库内容** `android-support-v4.jar`包含了许多...
在Android开发中,ListView是一个非常重要的组件,常用于展示大量数据列表。这篇开发笔记将深入讲解如何使用ListView以及其中的一些关键知识点。 首先,ListView的工作原理是通过Adapter来连接数据源和视图。当我们...
在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。然而,当这个列表包含许多图片时,如果直接在主线程中加载,会导致应用性能下降,甚至出现ANR(Application Not Responding)错误。因此,为了...
在Android开发中,ListView是一个非常重要的组件,常用于展示大量数据列表。然而,当ListView中的每个项都包含网络图片时,如果没有适当的优化,可能会导致应用性能下降,用户体验不佳。本资料包“安卓listview相关...
For more details, visitAnimated-Expanding-ListView Developed by @LeonardoCardoso. Animated Expanding ListView provides a fancy animation on expanding or collapsing the content of a listview item. It...
6. **使用 placeholders 和 error images**:在图片下载和加载期间,可以显示占位符图片,当下载失败时显示错误提示图片,提供更好的用户体验。 7. **考虑使用RecyclerView**:虽然题目中的关键词是ListView,但...
在Android开发中,ListView是展示大量数据的常用组件,但加载网络图片往往会导致性能问题,因为每次滚动ListView时,图片需要重新下载并显示,这可能导致界面卡顿。为了解决这个问题,我们需要对获取网络图片并缓存...
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。这个“Android高级应用源码-ListView停止滚动开启下载图片.rar”压缩包文件很可能包含了一个示例项目,演示了如何在用户滚动ListView时暂停...
在Android开发中,ListView是一个非常常见的控件,用于展示大量数据列表。它的高效性在于能够重用视图(ViewHolder模式),以减少内存消耗和提高滚动流畅性。然而,当ListView在滚动时,如果同时进行网络图片下载,...
在Android开发中,ListView是应用界面设计中非常常见的一种组件,它用于展示可滚动的、多行数据列表。本自学笔记将重点讲解如何在Android项目中创建并使用ListView,包括基本的设置、数据绑定和适配器的使用。 首先...