## 常用号码查询 ##
- ExpandableListView 是一个可以展开的listview 分组显示
- 填充数据要 用ExpandableListAdapter
- 在splash页面拷贝常用号码数据库 - /** * 拷贝常用号码数据库 */ private void copyCommNum() { // 获取AssetManager对象 AssetManager assets = getAssets(); InputStream addrIs = null; FileOutputStream fos = null; try { // 获取assets文件夹里的文件流 addrIs = assets.open("commonnum.db"); File targetFile = new File(getFilesDir(), "commonnum.db"); fos = new FileOutputStream(targetFile); int len = 0; byte[] buffer = new byte[1024]; while ((len = addrIs.read(buffer)) != -1) { fos.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } finally { GZipUtils.close(addrIs); GZipUtils.close(fos); } }
- 拷贝数据库到工程 在启动页面 拷贝到 files缓存文件夹里面 然后写dao
> 填充数据private class NumAdapter extends BaseExpandableListAdapter {
// 组的数量
@Override public int getGroupCount() {return CommonNumDao.getGroupCount(getApplicationContext());
}// 每组里孩子的数量
@Override public int getChildrenCount(int groupPosition) { return CommonNumDao.getChildCount(getApplicationContext(), groupPosition); }// 供外部使用 不用就不写
@Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return 0; }// 是否拥有一个稳定的id 用不到 默认
@Override public boolean hasStableIds() {return false;
}@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView tvGroup = new TextView(getApplicationContext()); String groupName = CommonNumDao.getGroupName(getApplicationContext(), groupPosition); tvGroup.setText(groupName); tvGroup.setTextSize(18); tvGroup.setTextColor(Color.BLACK); tvGroup.setBackgroundColor(Color.parseColor("#66000000")); tvGroup.setPadding(8, 8, 8, 8); return tvGroup; }@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView tvChild = new TextView(getApplicationContext()); String[] child = CommonNumDao.getChildName(getApplicationContext(), groupPosition, childPosition); tvChild.setText(child[0] + "\n" + child[1]); tvChild.setTextSize(16); tvChild.setTextColor(Color.BLACK); tvChild.setPadding(8, 8, 8, 8); return tvChild; } //孩子是否可点击 @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; }// 供外部使用 不用就去写
@Override public Object getGroup(int groupPosition) { // TODO Auto-generated method stub return null; }// 供外部使用 不用就去写
@Override public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return null; } // 供外部使用 不用就去写 @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return 0; } }- 设置组的点击事件
// 组的点击事件 ElvNum.setOnGroupClickListener(new OnGroupClickListener() {@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { // 判断是否展开 if (ElvNum.isGroupExpanded(groupPosition)) { // 已经展开去关闭 ElvNum.collapseGroup(groupPosition); } else { // 已经关闭去 展开 ElvNum.collapseGroup(mOpenGroup);// 把之前展开的关闭掉 ElvNum.expandGroup(groupPosition, true);// 展开一个组 ElvNum.setSelection(groupPosition);// 把当前的展开的组置顶 mOpenGroup = groupPosition;// 记住每次展开的position } return true; } });- 孩子的点击事件 去拨号
// 孩子的点击事件
ElvNum.setOnChildClickListener(new OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { String[] child = CommonNumDao.getChildName(getApplicationContext(), groupPosition, childPosition); String num = child[1]; Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:"+num)); startActivity(intent); return true; } });## 软件管理 ##
- 软件管理页面顶部实现= - 这个内存信息, 这个指的是内部存储, 不是运行时内存.- 写界面, 怎样设置进度条为水平样式? 不用记, 拖过来就行.
- 如何更改横向progressbar的 默认背景和进度样式 去系统样式文件里找到默认ProgressBar样式 发现需要修改android:progressDrawable这个属性 - 给 ProgressBar 设置 android:progressDrawable="@drawable/progress_horizontal" 属性即可,对应的 drawable文件:<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 背景 --> <item android:id="@android:id/background"> <shape> <solid android:color="#22000000" /> </shape> </item> <!-- 副进度条 --> <item android:id="@android:id/secondaryProgress"> <clip> <shape> <solid android:color="#22ff0000" /> </shape> </clip> </item> <!-- 主进度条 --> <item android:id="@android:id/progress"> <clip> <shape> <solid android:color="#55ff0000" /> </shape> </clip> </item> </layer-list>- 针对页面上面这块, 写一个自定义组合控件, 后面进程管理里还要用到.这里不需要自定义属性 因为数据需要在代码里动态设置,不能在
布局文件里写死. public class ProgressDescView extends LinearLayout { private TextView mTvTitle; private TextView mTvLeft; private TextView mTvRight; private ProgressBar mPbProgress; public ProgressDescView(Context context) { this(context, null); } public ProgressDescView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ProgressDescView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // 把填充出来的View添加到自己里面 View.inflate(context, R.layout.view_progress_des, this); // 初始化view mTvTitle = (TextView) findViewById(R.id.tv_pdv_title); mTvLeft = (TextView) findViewById(R.id.tv_pdv_left); mTvRight = (TextView) findViewById(R.id.tv_pdv_right); mPbProgress = (ProgressBar) findViewById(R.id.pb_pdv); mPbProgress.setMax(100); } public void setTitle(String text) { mTvTitle.setText(text); } public void setTextLeft(String text) { mTvLeft.setText(text); } public void setTextRight(String text) { mTvRight.setText(text); } /** * 设置进度, 最大值为100 * @param progress */ public void setProgress(int progress) { mPbProgress.setProgress(progress); } } - ProgressDescView整体的布局文件:<?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="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/tv_pdv_title" style="@style/TextContentStyle" android:layout_width="50dp" android:layout_marginTop="0dp" android:text="标题:" android:textSize="15sp"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ProgressBar android:id="@+id/pb_pdv" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="24dp" android:layout_centerVertical="true" android:progressDrawable="@drawable/progress_horizontal"/> <TextView android:id="@+id/tv_pdv_left" style="@style/TextContentStyle" android:layout_centerVertical="true" android:layout_marginLeft="0dp" android:text="xxx已用" android:textSize="13sp"/> <TextView android:id="@+id/tv_pdv_right" style="@style/TextContentStyle" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginLeft="0dp" android:layout_marginRight="3dp" android:text="xxx可用" android:textSize="13sp"/> </RelativeLayout> </LinearLayout>- 文件大小的计算
android.text.Formatter 类可以格式化文件大小
// 内部存储, 其实就是data目录的容量
File dataDirectory = Environment.getDataDirectory();
// 全部 long totalSpace = dataFile.getTotalSpace(); // 可用 long usableSpace = dataFile.getUsableSpace(); // 已用 long usedSpace = totalSpace - usableSpace; mPdvRom.setTitle("内存: "); mPdvRom.setTextLeft(Formatter.formatFileSize(getApplicationContext(), usedSpace) + "已用"); mPdvRom.setTextRight(Formatter.formatFileSize(getApplicationContext(), freeSpace) + "可用"); mPdvRom.setProgress((int) (usedSpace * 100f / totalSpace + 0.5f)); // 四舍五入 // SD卡 File sdDirectory = Environment.getExternalStorageDirectory(); // 总空间 long sdTotalSpace = sdDirectory.getTotalSpace(); // 剩余空间 long sdFreeSpace = sdDirectory.getFreeSpace(); long sdUsedSpace = totalSpace - freeSpace; mPdvSD.setTitle("SD卡: "); mPdvSD.setTextLeft(Formatter.formatFileSize(getApplicationContext(), sdUsedSpace) + "已用"); mPdvSD.setTextRight(Formatter.formatFileSize(getApplicationContext(), sdFreeSpace) + "可用"); mPdvSD.setProgress((int) (sdUsedSpace * 100f / sdTotalSpace+ 0.5f));