接上一篇,如今分析android\vendor\qcom\opensource\fm\fmapp2\src\com\caf\fmradio\StationListActivity.javajava
protectedvoid onCreate(Bundle savedInstanceState)方法裏android
綁定FMRadioService服務app
bindService((newIntent()).setClass(this, FMRadioService.class), osc, 0);ide
實例化ListView對象this
mStationList= (ListView) findViewById(R.id.station_list);.net
上下文菜單監聽事件xml
?mStationList.setOnCreateContextMenuListener(this);對象
ListView監聽每一個Item事件索引
mStationList.setOnItemClickListener(newOnItemClickListener()事件
調用mService.tune((int)((fFreq * 1000)));方法調頻
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.station_list);
bindService((new Intent()).setClass(this, FMRadioService.class), osc, 0);
mStationList = (ListView) findViewById(R.id.station_list);
// mPresetList = new PresetList("StationList");
mStationList.setOnCreateContextMenuListener(this);
mStationList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
String freq = ((HashMap<String, String>) mAdapter.getItem(arg2))
.get("freq");
Float fFreq = Float.parseFloat(freq);
if (mService != null) {
try {mService.tune((int) ((fFreq * 1000)));
finish();
} catch (RemoteException e) {
e.printStackTrace();
}
} else {
Log.d(LOGTAG, "mService is null........");
}
}
});
}
上下文菜單
?public void onCreateContextMenu(ContextMenumenu, View v,ContextMenuInfo menuInfo)
添加從命名和刪除功能
menu.add(0,CONTEXT_MENU_RENAME, 0, getString(R.string.preset_rename));
menu.add(0,CONTEXT_MENU_DELETE, 0, getString(R.string.preset_delete));
標題
menu.setHeaderTitle(getString(R.string.station_name)+getNameFromId(mItemId));
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
AdapterContextMenuInfo mi = (AdapterContextMenuInfo) menuInfo;
menu.add(0, CONTEXT_MENU_RENAME, 0, getString(R.string.preset_rename));
menu.add(0, CONTEXT_MENU_DELETE, 0, getString(R.string.preset_delete));
mItemId = mi.position;
menu.setHeaderTitle(getString(R.string.station_name)+getNameFromId(mItemId));
}
protected void onPrepareDialog(int id, Dialog dialog, Bundle b) {
// TODO Auto-generated method stub
// super.onPrepareDialog(id, dialog);
// After change system language, current function will be executed before
// onResume , so execute load to ensure adapter is not null.
load();
switch (id) {
case DIALOG_RENAME_ID:
mRenameDialog.setTitle(getString(R.string.station_name)+getNameFromId(mItemId));
final EditText editText = (EditText) mRenameDialog
.findViewById(R.id.name);
editText.setText(getNameFromId(mItemId));
Button bOk = (Button) mRenameDialog.findViewById(R.id.save);
bOk.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
String rename = editText.getText().toString();
if (TextUtils.isEmpty(rename) || TextUtils.isEmpty(rename.trim())) {
Context context = getApplicationContext();
Toast toast = Toast.makeText(context, getString(R.string.station_name_empty),
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
} else if (stationNameExist(rename)) {
Context context = getApplicationContext();
Toast toast = Toast.makeText(context,
getString(R.string.station_name_exist, rename), Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
} else {
saveStationName(mItemId,rename);
mRenameDialog.dismiss();
}
}
});Button bCancel = (Button) mRenameDialog.findViewById(R.id.cancel);
bCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mRenameDialog.dismiss();
}
});
break;
case DIALOG_DELETE_ID:
mDeleteDialog.setTitle(getString(R.string.station_list_delete_station, getNameFromId(mItemId)));
TextView prompt = (TextView) mDeleteDialog.findViewById(R.id.prompt);
prompt.setText(getString(R.string.station_list_delete_station_prompt,getNameFromId(mItemId)));
Button bDelete = (Button) mDeleteDialog.findViewById(R.id.delete);
bDelete.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
deleteStation(mItemId);
mDeleteDialog.dismiss();
}
});
Button bCancelDelete = (Button) mDeleteDialog.findViewById(R.id.cancel);
bCancelDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDeleteDialog.dismiss();
}
});
break;
}
}
判斷電臺名字是否存在
privateboolean stationNameExist(String name)
private boolean stationNameExist(String name) {
for (HashMap<String, String> item : list) {
if (item != null && name.equals(item.get("name"))) {
return true;
}
}
return false;
}
重命名保存方法
saveStationName(mItemId,rename);
mRenameDialog.dismiss();
private void saveStationName(int id, String name) {
Integer stationIndex = mIndex.get(new Integer(id));
SharedPreferences sp = getSharedPreferences(
FMRadio.SCAN_STATION_PREFS_NAME, 0);
SharedPreferences.Editor editor = sp.edit();
editor .putString(FMRadio.STATION_NAME + (stationIndex.intValue()), name);
editor.commit();
load();
}
刪除電臺方法
deleteStation(mItemId);
mDeleteDialog.dismiss();
private void deleteStation(int id) {
SharedPreferences sp = getSharedPreferences( FMRadio.SCAN_STATION_PREFS_NAME, 0);
Integer stationIndex = mIndex.get(new Integer(id));
SharedPreferences.Editor editor = sp.edit();
editor.remove(FMRadio.STATION_NAME + (stationIndex));
editor.remove(FMRadio.STATION_FREQUENCY + (stationIndex));
editor.commit();
load();
}
經過調用SharedPreferences保存名字後加載 load();
protected void load() {
list.clear();
mIndex.clear();
SharedPreferences sp = getSharedPreferences(FMRadio.SCAN_STATION_PREFS_NAME, 0);
int station_number = sp.getInt(FMRadio.NUM_OF_STATIONS, 0);
for (int i = 1; i <= station_number; i++) {
HashMap<String, String> item = new HashMap<String, String>();
String name = sp.getString(FMRadio.STATION_NAME + i, "");
int frequency = sp.getInt(FMRadio.STATION_FREQUENCY + i, 0);
if (!name.equals("") && frequency != 0) {
item.put("name", name); item.put("freq", String.valueOf(frequency / 1000.0f));
mIndex.put(new Integer(list.size()), new Integer(i));
list.add(item);
}
}
mAdapter = new SimpleAdapter(this, list, R.layout.station_list_item,
new String[] { "name", "freq" }, new int[] { R.id.name,
R.id.freq });
mStationList.setAdapter(mAdapter);
}
方法
privatevoid saveStationName(int id, String name)
editor.putString(FMRadio.STATION_NAME+ (stationIndex.intValue()),
?
privatevoid deleteStation(int id) 刪除方法,刪除名字和頻率
editor.remove(FMRadio.STATION_NAME +(stationIndex));
editor.remove(FMRadio.STATION_FREQUENCY +(stationIndex));
以id獲取頻率方法
privateint getFrequencyFromId(int id)
private int getFrequencyFromId(int id) {
String freq = ((HashMap<String, String>) mAdapter.getItem(id))
.get("freq");
Float fFreq = Float.parseFloat(freq);
return (int) ((fFreq * 1000));
}
以Id獲取頻率名字方法
privateString getNameFromId(int id)
private String getNameFromId(int id) {
String name = ((HashMap<String, String>) mAdapter.getItem(id))
.get("name");
return name;
}
加載方法,清除ListView列表內容和索引id,從SharedPreferences裏獲取頻道個數
使用for循環將xml數據(電臺名字和頻率)添加list列表裏使用SimpleAdapter將數據顯示在UI界面裏
protected void load() {
item.put("name", name);
item.put("freq",String.valueOf(frequency / 1000.0f));
mIndex.put(newInteger(list.size()), new Integer(i));
list.add(item);
}
mAdapter= new SimpleAdapter(this, list, R.layout.station_list_item,
new String[] {"name", "freq" }, new int[] { R.id.name,
R.id.freq });
在StationListActivity類的onDestroy() 方法對FMRadioService服務解綁。
unbindService(osc); protected void onDestroy() { unbindService(osc); mService = null; super.onDestroy(); }