編輯:關於Android編程
有些Android手機中會帶有一些常用號碼的功能,比如訂餐電話、公共電話、航空機票,等等諸如此類的服務,點擊相應的號碼會自動彈出撥打電話的界面。那下面我們就一起來實現一個手機常用號碼功能的小例子吧。
首先,這些常用號碼放置在一個SQLite數據庫中,我們將這些號碼從數據庫中讀取出來,按照相應的順序顯示到Android系統提供的ExpandableListView中(有關ExpandableListView的詳細用法請大家參考Android官方文檔,我在這裡就不多說了),然後給每個條目設置點擊事件,在點擊事件中激活撥打電話的界面,並將相應的號碼傳遞到撥打電話的界面。
好了,原理講完了,是不是很簡單呢?下面,我們就一起來實現這些具體的功能吧。
我們首先將數據庫放置在Android項目下的assets目錄
如下圖:
新建數據操作類CommonNumberService,這個類中主要有4個方法,一個是構造方法,在構造方法中我們將Android上下文對象傳遞到這個類中,其他3個方法實現了將數據庫拷貝到/data/data/應用包名/files目錄,然後實現數據的查詢操作。
在構造方法中,我們將上下文對象傳遞到這個類中
具體實現代碼如下:
private Context context; public CommonNumberService(Context context) { super(); this.context = context; }
具體代碼如下:
/** * 得到組數據 * @return */ public List
具體代碼如下:
/** * 得到子條目的數據 * @return */ public List>> getChildData(){ List
>> childData = new ArrayList
>>(); List
> groupData = this.getGroupData(); File file = new File(context.getFilesDir(), commonnum.db); SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY); if(db.isOpen()){ for(int i = 0; i < groupData.size(); i++){ String idx = groupData.get(i).get(idx); List > list = new ArrayList >(); Cursor c = db.query(table + idx, new String[]{_id, number, name}, null, null, null, null, null); while(c.moveToNext()){ Map map = new HashMap (); String name = c.getString(c.getColumnIndex(name)); String number = c.getString(c.getColumnIndex(number)); map.put(name, name); map.put(number, number); list.add(map); } c.close(); childData.add(list); } db.close(); } return childData; }
具體實現代碼如下:
package cn.lyz.mobilesafe.engine; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; /** * 獲取常用號碼 * @author liuyazhuang * */ public class CommonNumberService { private Context context; public CommonNumberService(Context context) { super(); this.context = context; } /** * 將數據類拷貝到files目錄 */ public void copyDbToFilesDir(){ //將數據庫拷貝到files目錄 File file = new File(context.getFilesDir(), commonnum.db); if(!file.exists()){ try { InputStream in = context.getAssets().open(commonnum.db); OutputStream out = new FileOutputStream(file); byte[] buffer = new byte[1024]; int len = 0; while((len = in.read(buffer)) != -1){ out.write(buffer, 0, len); } out.close(); in.close(); } catch (Exception e) { e.printStackTrace(); } } } /** * 得到組數據 * @return */ public List> getGroupData(){ List > groupData = new ArrayList >(); File file = new File(context.getFilesDir(), commonnum.db); SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY); if(db.isOpen()){ Cursor c = db.query(classlist, new String[]{name, idx}, null, null, null, null, null); while(c.moveToNext()){ Map map = new HashMap (); String name = c.getString(c.getColumnIndex(name)); String idx = c.getString(c.getColumnIndex(idx)); map.put(name, name); map.put(idx, idx); groupData.add(map); } c.close(); db.close(); } return groupData; } /** * 得到子條目的數據 * @return */ public List >> getChildData(){ List
>> childData = new ArrayList
>>(); List
> groupData = this.getGroupData(); File file = new File(context.getFilesDir(), commonnum.db); SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY); if(db.isOpen()){ for(int i = 0; i < groupData.size(); i++){ String idx = groupData.get(i).get(idx); List > list = new ArrayList >(); Cursor c = db.query(table + idx, new String[]{_id, number, name}, null, null, null, null, null); while(c.moveToNext()){ Map map = new HashMap (); String name = c.getString(c.getColumnIndex(name)); String number = c.getString(c.getColumnIndex(number)); map.put(name, name); map.put(number, number); list.add(map); } c.close(); childData.add(list); } db.close(); } return childData; } }
在這個類中我們主要實現了,獲取界面控件,然後調用CommonNumberService類中方法,給界面封裝數據,同時設置ExpandableListView子條目的點擊事件,激活撥打電話接界面,並將選擇的電話號碼傳遞到撥打電話界面。
具體實現代碼如下:
package cn.lyz.mobilesafe.activity; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnChildClickListener; import android.widget.SimpleExpandableListAdapter; import cn.lyz.mobilesafe.R; import cn.lyz.mobilesafe.engine.CommonNumberService; /** * 常用號碼 * @author liuyazhuang * */ public class CommonNumberActivity extends Activity { private ExpandableListView elv_common_number; private CommonNumberService service; private SimpleExpandableListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.common_number); elv_common_number = (ExpandableListView) findViewById(R.id.elv_common_number); this.service = new CommonNumberService(this); //將數據庫拷貝到files目錄 service.copyDbToFilesDir(); //獲取組數據 List> groupData = service.getGroupData(); //獲取子條目數據 List >> childData = service.getChildData(); adapter = new SimpleExpandableListAdapter( this, groupData, android.R.layout.simple_expandable_list_item_1, new String[]{name}, new int[]{android.R.id.text1}, childData, android.R.layout.simple_expandable_list_item_2, new String[]{name, number}, new int[]{android.R.id.text1, android.R.id.text2}); elv_common_number.setAdapter(adapter); elv_common_number.setOnChildClickListener(new MyOnChildClickListener()); } /** * 點擊事件 * @author liuyazhuang * */ private class MyOnChildClickListener implements OnChildClickListener{ @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Map
map = (Map ) adapter.getChild(groupPosition, childPosition); String number = map.get(number); Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse(tel:+number)); startActivity(intent); return false; } } }
這個布局很簡單,就是放置了一個ExpandableListView
具體實現如下:
在工作中,曾多次碰到ScrollView嵌套ListView的問題,網上的解決方法有很多種,但是雜而不全。我試過很多種方法,它們各有利弊。 在這裡我將會從使用Sc
直接上圖: 在android 中導入項目後 包出現錯誤的解決方法 選中項目,右擊打開Proper
介紹Android中的網絡請求一般就是兩種 HttpURLConnection 和HttpClient,不論是哪一種在使用的時候都是經過一系列的封裝 很繁瑣有沒有,而Go
簡介 Java代碼是非常容易反編譯的。為了很好的保護Java源代碼,我們往往會對編譯好的class文件進行混淆處理。 ProGuard是一個混淆代