Android开发文档
●注意事项________________________ 3●搭建SDK平台__________________ 4
开发工具请参阅“开发环境安装工具”,______________________________________ 4 搭建方法请参阅文件夹“开发环境安装指南”_________________________________ 4 ●常用的Android指令和模拟器参数_ 4
?Android模擬器命令列啟動模式__________________________________________ 4 ?使用mksdcard指令模擬1GB的記憶卡 __________________________________ 5 ?模擬插入SD 卡的模擬器 _______________________________________________ 5 ?使用adb+push 上載檔案到SD記憶卡__________________________________ 5 ?使用adb+pull 從SD 記憶卡下載檔案___________________________________ 5 ?刪除SD 卡裡面的檔案 _________________________________________________ 5 ?Android模擬器影片播放方法___________________________________________ 5 ?安裝APK 應用程式___________________________________________________ 5 ?移除APK 應用程式___________________________________________________ 6 ?ADB 系統除錯與連結工具______________________________________________ 6 ?Emulator 命令列啟動參數 ______________________________________________ 7 ●开发方法________________________ 7
一.创建Activity:___________________________________________________ 7 二.Activity之间的跳转,例如Activity1和Activity2;____________________ 7 三.带值传递的Activity之间的跳转 _____________________________________ 8 四.对话框___________________________________________________________ 8 五.提示框___________________________________________________________ 9 六.自动消失的提示框_________________________________________________ 9 七.控件与代码绑定方法_______________________________________________ 9 八.使用点击事件_____________________________________________________ 9 九.使用机械按键:___________________________________________________ 9 十.设置当前编辑焦点________________________________________________ 10 十一.保存内容______________________________________________________ 10 十二.打开浏览器____________________________________________________ 11 十三.加入选单:____________________________________________________ 11 十四.查看调试信息__________________________________________________ 11 十五.Android Sdcard的使用_________________________________________ 13 十六.RadioGroup ___________________________________________________ 15 十七.Spinner应用__________________________________________________ 16
十八.文件处理______________________________________________________ 19
1.SharedPreferences _____________________________________________ 19
2.Files文件路径data/data/package name/files/new1_____________________ 19
3.Databases路径/data/data/package_name/databases/filename____________ 26 十九.资源__________________________________________________________ 26 二十.SollView滚动显示______________________________________________ 27 二十一.如何设置隐藏Android应用的标题栏和状态栏___________________ 29 import android.view.Window;_______________________________________ 29 二十二.RandomAccessFile随机存取文件 _______________________________ 30 先需要import下面的类:_________________________________________________ 30 import java.io.RandomAccessFile;_________________________________ 30 }______________________________________________________________________ 32 二十三.根据内容显示不同颜色的文本__________________________________ 32 import android.text.Html;__________________________________________ 32 二十四.Activity切换或横竖切换导致的onCreate重复执行________________ 32 二十五.获取屏幕尺寸________________________________________________ 33 二十六.activity的两种调度方式 _______________________________________ 33 作为一个运行时的对象,activity的调度方式大致分为两种:一种是指定activit所在类名直接调度,另一种是利用activity可以处理的intent进行调度。+ z+ p& c" L T2 S" s$ s x8 F# q. b) U, R6 ]( ^2 ?2 g 同一种intent可以被不同应用的不同activity处理。当出现此种情况时,用户需要选择具体的activity。 ___________________________ 33 调度方式一:____________________________________________________________ 33 startActivity(intent); _____________________________________________ 33 调度方式二:____________________________________________________________ 33 二十七.媒体库等创建________________________________________________ 34 1.android中歌曲媒体库都是在什么时候创建的________________________________ 34 Answer:开机完成后系统会对文件进行递归扫描,将媒体文件存入对应的数据库中。34 2.如果我想将其他某种同类型的文件创建一个库,以方便查找,应该怎么弄?____ 34 Answer:参考源码吧,看这个MediaProvider ,系统目前支持的Provider包含有: ___ 34 ApplicationsProvider:____________________________________________________ 34 CalendarProvider:_______________________________________________________ 34 ContactsProvider:________________________________________________________ 34 DownloadProvider:______________________________________________________ 34 DrmProvider: ___________________________________________________________ 34 GoogleContactsProvider: __________________________________________________ 34 GoogleSubscribedFeedsProvider:___________________________________________ 34 ImProvider:____________________________________________________________ 34 MediaProvider:__________________________________________________________ 34 TelephonyProvider:______________________________________________________ 34 UserDictionaryProvider:__________________________________________________ 34 WebSearchProvider:______________________________________________________ 34 3. IntentFilter f = new IntentFilter(); f.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
f.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); f.addAction(Intent.A
CTION_MEDIA_UNMOUNTED); f.addDataScheme("file"); registerReceiver( mScanListener, f);意思?Answer:以上代码是要注册一个Receiver,当媒体扫描开始扫描结束拔掉SD卡时,会执行这个Receiver的onReceive()。 ___________________ 34 二十八.如何在Android 裡面偵測SD Card 的插入與移除 ________________ 34 二十九.ListView,有时候Activity需要继承ListActivity,则对应的xml文件中必须有一个ListView,例如_________________________________________________ 35 三十.教你开启自启动程序!__________________________________________ 35 三十一.比较onSaveInstanceState() 与onRetainNonConfigurationInstance()在不同需求中的用法__________________________________________________________ 38 三十二.这个例子将首先启动一个包含两个按钮的Activity。其中一个按钮用于调用本地通讯录,并将所选择的某一项作为返回值传给当前Activity。另外一个按钮的作用是查看当前所选择的通讯信息。正常的流程是当第一次启动程序后,第二个查看信息按钮是不可用状态。当通过Pick按钮确定选择并返回某一通讯录内容时,查看信息按钮的状态切换为可操作状态。然后当改变设备的Configuration时,可以注意到即便是Activity通过onCreate()重新构建,但是之前所保证的UI属性依然保持最后一次操作的状态。39
三十三.Fdg ________________________________________________________ 39 三十四.Sdf_________________________________________________________ 39 三十五.asda________________________________________________________ 39
注意事项
1.*.java的文件名不能和对象名相同,例如spinner.java,当调用spinner对象时,将报错;
2.文件读取乱码问题:
有时候文件读取出来是乱码,那很有可能是编码格式不匹配,系统默认文件编码为
“UTF-8”,如果你的文件不是这个编码,在读取时就需要转换,例如
private InputStream is; /* 文件输入流,读取文件流 */
String data = null;
private byte [] b; /* 字节数组,用来读取文件内容 */
is = openFileInput("testdemo16.txt");
b = new byte [5024];
is.read(b);
//data = new String(b,"GBK");/*文件编码为GBK*/
//data = new String(b,"UTF-16");/*文件编码为UNICODE*/
is .close();
3.移位操作
移位操作时必须加上(),否则结果将会是错误的,例如
Value = (int)((templong4<<24)+(templong3<<16)+(templong2<<8) +(templong1));
4.java系统的数值存入文件中,是高字节在前,低字节在后的,其文件系统是按这种方式进行读写的,而我们通常是低字节在前,高字节在后,所以在引用时要注意转换;例如
if(LowToHigh==true)
{/*如果是按低前高后的方式,则将value的值的高低位对调后再写入*/
templong1 = ((Value>>24) & 0xff);
templong2 = ((Value>>16) & 0xff);
templong3 = ((Value>>8) & 0xff);
templong4 = ((Value) & 0xff);
Value =
(int)((templong4<<24)+(templong3<<16)+(templong2<<8) +(templong1));
}
raf.writeInt(Value);
5.从文件中读取一个值给byte型变量时,如果文件中的值大于127,读取出来后的byte值将会是一个负值,如果要将其赋值给int,要进行转换,将string中的某个byte取出来也是这样,转换规则为:
/*
* byte转换为int
*/
int getintvalue(byte value)
{
if(value<0)
return (int)(256+value);
else
return (int)value;
}
6.更改模拟器界面:
https://www.doczj.com/doc/4a14516479.html,/
这里有很多模拟器的界面下载,下载后解压到安装sdk目录下的platforms\android-1.5\skins中,替换原来的,但是有可能显示器太小,显示不下,可以在run/run configurations中的Target,"Additional Emulator Command Line Options”选项中增加-scale 0.5,后面的值为缩放比例
●搭建SDK平台
开发工具请参阅“开发环境安装工具”,
搭建方法请参阅文件夹“开发环境安装指南”
●常用的Android指令和模拟器参数
Android模擬器命令列啟動模式
在android-sdk-windows-1.1\tools執行emulator以執行模擬器
加上-skin參數,指定顯示模式為HVGA-L,則可轉為橫向
emulator - skin HVGA-L (480*320,水平顯示)
emulator - skin HVGA-L (320*480,垂直顯示,模擬器預設模式)
emulator - skin HVGA-L (320*240,水平顯示)
emulator - skin HVGA-L (240*320,垂直顯示)
?使用mksdcard指令模擬1GB的記憶卡
mksdcard 1024M sacard.img
?模擬插入SD 卡的模擬器
emulator - sdcard sdcard.img
?使用adb+push 上載檔案到SD記憶卡
adb push 001.jpg /sdcard (複製檔案到 /sdcard 目錄下)
adb push pictures /sdcard (複製 picture 照片目錄到 /sdcard 目錄下) adb push mp3 /sdcard (複製 mp3 音樂目錄到 /sdcard 目錄下)
adb shell (Android 模擬器啟動命令列模式)
#cd /sdcard (進入 /sdcard 目錄)
#ls (查看 SD 記憶卡中的檔案)
?使用adb+pull 從SD 記憶卡下載檔案
adb pull /sdcard/001.jpg . (下載 /sdcard 目錄下的檔案)
adb pull /sdcard/pictures . (下載 sdcard 目錄下的 pictures 目錄)
?刪除SD 卡裡面的檔案
adb shell
#ced /sdcard
#rm 001.jpg (刪除 SD 記憶卡裡的檔案)
#rm -r * (刪除 SD 記憶卡裡所有檔案與目錄)
?Android模擬器影片播放方法
mksdcard 4096M video.img (製作一個影像檔的 SD 記憶卡)
adb push video.avi /sdcard (從電腦複製影像檔到 SD 卡中)
emulator -sdcard video.img (啟動模擬器並載入 SD 卡)
下載免費的影片播放軟體,ex: Meridian Video Player (iiivpa.apk)
https://www.doczj.com/doc/4a14516479.html,/site/eternalsandbox/Home/meridian-video-playe r
adb install iiivpa.apk (安裝Meridian Video Player)
接下來就可以用裝上去的player播放.mp4、3gp與.wmv三種檔案格式
?安裝APK 應用程式
adb install filename.apk (安裝filename.apk)
adb install -r filename.apk (保留已設定資料,重新安裝filename.apk) adb -s emulator-5554 install filename.apk (指定安裝 APK 套件在 5554 的Android 模擬器中)
?移除APK 應用程式
adb uninstall package
adb uninstall -k package (移除程式時,保留資料)
此package名稱不是安裝APK套裝時的檔名或顯示在模擬器中的應用程式名稱
可以先到/data/data或data/app目錄下,查詢想移除的package名稱
adb shell
ls /data/data 或 /data/app (查詢 Package 名稱)
exit
adb uninstall package (移除查詢到的 Package)
?ADB 系統除錯與連結工具
$adb devices (顯示目前有多少個模擬器正在執行)
$adb -s
adb -s emulator-5554 install email.apk
$adb install apkfile (安裝 APK 應用程式套件)
adb install email.apk
$adb uninstall package (移除 APK 應用程式套件)
adb uninstall com.android.email
$adb shell (進入 Android 系統指令列模式)
$ls
$dmesg (查看 Android Linux Kernel 運作訊息)
ls - 顯示檔案目錄
cd - 進入目錄
rm - 刪除檔案
mv - 移動檔案
mkdir - 產生目錄
rmdir - 刪除目錄
$adb push
adb push mp3 /sdcard
$adb pull
adb pull /data/app/com.android.email
$adb logcat (監控模擬器運作紀錄,以Ctrl + c 離開監控模式)
$adb bugreport (產生 adb 除錯報告)
$adb get-state (獲得 adb 伺服器運作狀態)
$adb start-server (啟動 adb 伺服器)
$adb kill-server (關掉 adb 伺服器)
$adb forward tcp:6100 tcp:7100 (更改模擬器網路 TCP 通訊埠)
$adb shell ps -x (顯示 Android 上所有正在執行的行程)
$adb version (顯示 adb 版本)
$adb help (顯示 adb 指令參數)
Emulator 命令列啟動參數
emulator -timezone Asia/Taipei (指定時區)
emulator -no-boo-anim (省略開機小機器人動畫畫面)
emulator -scale auto (調整模擬器視窗大小)
emulator - scale factor (factor: 0.1-3.0)
emulator -dpi-device 300 (更改模擬器的解析度,default為 165dpi) emulator -skin
emulator -help-keys (顯示鍵盤快速鍵說明)
emulator -shell (相當於adb shell 功能)
emulator -data data.img (使 /data 目錄使用 data.img 的檔案空間) emulator -sdcard sdcard.img (使 /sdcard 目錄使用 sdcard.img 的檔案空間) emulator -cache cache.img (瀏覽器暫存檔儲存空間)
emulator -wipe-data (使模擬器恢復到原廠設定)
emulator -help (顯示 emulator 指令參數)
开发方法
一.创建Activity:
1.在layout中先新建一个xml文件(例如文件名为display,文件名只能够为小写),输
入:
关闭后重新打开;
2.在AndroidManifest.xml中加入
3.选择「New->Class」选项。Eclipse 会跳出一个「New Java Class」对话框。
在对话框中的「Name」一栏上填入「Report」。「Report」的字头需大写,这是Java 程式语言的默认规则。
在「Superclass」一栏右方,按下「Browse...」,Eclipse 会跳出「Superclass Selection」对话框。在对话框中的「Choose a type」栏位中输入「activity」,输入框下方的「Matching items」栏位中,会显示出所有可能的类别。我们选择「Activity - android.app - ...」这个选项,点击右下方的「ok」按鈕,回到上一個对话框。
此时,「Superclass」栏位中将填入「android.app.Activity」信息。按下对话框右下角的「Finish」键,Eclipse 会在「bmi」资料夹中,产生一个对应的「Report.java」档案。二.Activity之间的跳转,例如Activity1和Activity2;
Activity1中:
Intent intent = new Intent();
intent.setClass(TestDemo.this, Display.class);
s tartActivity(intent);
Activity2中按return键返回到Activity1
如果是:
Intent intent = new Intent();
intent.setClass(Activity1.this, Activity2.class);
startActivity(intent);
则Activity2中按return键返回到Activity1的上一层,因为Activity1已经Destroy 了;
三.带值传递的Activity之间的跳转
需要import android.content.Intent;
Activity1中:
Intent intent = new Intent();
i ntent.setClass(TestDemo.this, Display.class);
Bundle bundle = new Bundle();
bundle.putString("edtInput",edtInput.getText().toString());
bundle.putString("ConfirmInput",ConfirmInput.getText().toString() );
/*将Bundle对象assign给Intent*/
intent.putExtras(bundle);
startActivity(intent);
Activity2中
/* 取得Intent中的Bundle对象 */
Bundle bunde = this.getIntent().getExtras();
String sConfirmInput = bunde.getString("ConfirmInput");
String sedtInput = bunde.getString("edtInput");
四.对话框
new AlertDialog.Builder(TestDemo.this).setTitle("警告!").setMessage( "设置还没有完成,确定退
出?").setIcon(R.drawable.icon).setPositiveButton("确定",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// billdb.close();
setResult(RESULT_OK);//确定按钮事件
finish();
}
}).setNegativeButton("取消",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setResult(RESULT_CANCELED);//取消按钮事件
}
}).show();
五.提示框
new AlertDialog.Builder(TestDemo.this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("错误!")
.setMessage("两次密码不同,请重新输入!")
.show();
六.自动消失的提示框
import android.widget.Toast;
Toast.makeText(TestDemo.this,"BMI 計算器",Toast.LENGTH_SHORT).show();
Toast.make.Text(TestDemo.this,”BMI 计器”,Toast_LEHGTH_SHORT).show();; 七.控件与代码绑定方法
btnConfirm=(Button)findViewById(R.id.btnConfirm);//控件与代码绑定八.使用点击事件
设置:
btnConfirm.setOnClickListener(new ClickListener());//使用点击事件使用:
class ClickListener implements OnClickListener
{
public void onClick(View v)
{
if(v==btnConfirm)
{ /*
*显示提示框
*/
}
}
}
九.使用机械按键:
public boolean onKeyDown(int keyCode, KeyEvent msg) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
// 按下中键时触发的事件,这里https://www.doczj.com/doc/4a14516479.html,提醒网友G1或ADP1使用的是轨迹球,这个Trackball仍然可以按下的,不仅仅是方向的导航。
edtInput.setText("Center");
return (true);
}
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
//向左
return (true);
}
if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
//向右
return (true);
}
if(keyCode == KeyEvent.KEYCODE_DPAD_UP){
//向上
return (true);
}
if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){
//向下
return (true);
}
if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){
//音量减
return (true);
}
if(keyCode == KeyEvent.KEYCODE_VOLUME_UP){
//音量加
return (true);
}
if(keyCode == KeyEvent.KEYCODE_POWER){
//关机
return (true);
}
if(keyCode == KeyEvent.KEYCODE_CALL){
//拨号
return (true);
}
if(keyCode == KeyEvent.KEYCODE_BACK){
//返回
return (true);
}
if(keyCode == KeyEvent.KEYCODE_ENDCALL){
//挂机
return (true);
}
return super.onKeyDown(keyCode, msg);
}
十.设置当前编辑焦点
edtInput.requestFocus();/*设置edtInput为当前焦点*/
十一.保存内容
保存
public static final String SETTING_INFOS="SEETTING_Infos";
public static final String PASSWORD="PASSWORD";
haredPreferences settings = getSharedPreferences(SETTING_INFOS,0);
s ettings.edit()
.putString(PASSWORD, edtInput.getText().toString())
.commit();
读取
SharedPreferences settings = getSharedPreferences(SETTING_INFOS,0);
String name = settings.getString(PASSWORD,"");
edtInput.setText(name);
十二.打开浏览器
需要import https://www.doczj.com/doc/4a14516479.html,.Uri;
Toast.makeText(TestDemo.this, "下一个页面",
Toast.LENGTH_SHORT).show();
//go to url 這是註解
Uri uri = Uri.parse("https://www.doczj.com/doc/4a14516479.html,/");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
十三.加入选单:
先需要:
import android.view.Menu;
import android.view.MenuItem;
完整的程式碼如下:
protected static final int MENU_ABOUT = Menu.FIRST;
protected static final int MENU_Quit = Menu.FIRST+1;
@Override
onCreateOptionsMenu(Menu menu)
{
Super.onCreateOptionMenu(menu)
}
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_ABOUT, 0, "關於...");
menu.add(0, MENU_Quit, 0, "結束");
return true;
}
public boolean onOptionsItemSelected(MenuItem item)
{
super.onOptionsItemSelected(item);
switch(item.getItemId()){
case MENU_ABOUT:
openOptionsDialog();
break;
case MENU_Quit:
finish();
break;
}
return true;
}
十四.查看调试信息
Log 的使用格式如下
Log.代号(标签,讯息);
代号
依据讯息的类型,我们有5种 Log 讯息形式可以用作记录。
Log.v (VERBOSE) 详细讯息
Log.d (DEBUG) 除错讯息
Log.i (INFO) 通知讯息
Log.w (WARN) 警告讯息
Log.e (ERROR) 错误讯息
一般较常用的是 Log.d(除错讯息) 、Log.w (警告讯息),和 Log.e (错误讯息)。范例中多使用 Log.d(除错讯息) 。
标签
private static final String TAG = "Bmi";
....
Log.d(TAG, "find Views");
Log.(v,d,i,w,e) 的第一个参数,是一个自定的记录标签。在目前的 BMI 应用程式范例中,我们还看不太出來自定记录标签的意义。但是当程式的功能一扩张的時候(例如像在 AppDemos 范例那样,包含各种不同功能),我们可以为不同的功能,给予不同的记录标签。
讯息
Log.d(TAG, "find Views");
在 Log.(v,d,i,w,e) 的第二个参数中,加入我们想要记录的资讯。
我们也不是一定得为某个TAG 事先定义好一个记录标签,我们可以用当前的Activity 名称来作为记录标签:
Log.e(this.toString(), "error: " + err.toString());
在偵錯環境中查看除錯訊息
在程式中加上除錯訊息後,我們可以使用除錯模式 (Debug Mode) 運行模擬器,並透過開發工具來查看除錯訊息。
偵錯工具的正式名稱為 Dalvik Debug Monitor Service (DDMS)。
啟動模擬器
使用除錯模式 (Debug Mode) 運行模擬器(選單列->Run->Debug History->BMI)。
切換到偵錯環境配置
點選開發環境右上角的 "Open Perspective"按鈕,選擇 "Other..."選項。選擇後會彈出一個「Open Perspective」(開啟環境配置)對話框。對話框中列出了所有可用的環境配置列表,選擇 "Debug"。此時,右上角的環境配置圖示列中,會多出一個「Debug」環境配置圖示。整個開發工具的介面配置也為之一變。在右上角的環境配置圖示列中,點選「Java」環境配置圖示,就會回到我們原來的介面配置。
現在先切換到「Debug」環境配置,可以看到右下角的「LogCat」視窗。其上有五個醒目的 V、D、I、W、E 圖示,分別代表著五種 Log 形式(Verbose, Debug, Info, Warn, Error),還有一個綠色的「+」號,與一個紅色的「-」號。
模擬器運行時會產生很多的訊息記錄(Log),一不注意就看到眼花了。這時候,我們自訂的記錄標籤(範例中自訂的標籤是「Bmi」)就派上了用場,正好可以為 LogCat 加上一個過濾器(Log Filter),只顯示與「Bmi」標籤相關的訊息記錄。
加入訊息記錄過濾器(Log Filter)
在「LogCat」視窗右側,按下綠色的「+」號,會彈出一個「Log Filter」視窗。在「Log Filter」
視窗的「by Log Tag」欄位中填入「Bmi」,並填入任意的「Filter Name」後,按下「ok」按鈕。「LogCat」視窗上會多出一個與我們填入的「Filter Name」相同的標籤。裡面的內容,即所有標示為「Bmi」的自訂訊息記錄。
十五.Android Sdcard的使用
1、首先是生成sdcard镜像文件sdcard.img或者是其他的名称。命令为:mksdcard -l sdcard capacity directory
例如:mksdcard 1024M e:\android-sdk_windows-1.5_r2\tools\card\mycard.abc directory 指的是镜像文件存放的目录,capacity就是要创建的镜像文件的容量。这里将镜像文件放在当前目录下。
2、在开发环境(Eclipse)中,可以在Run Configuration对话框中设置启动参数,如图1所示。
图1
当然,也可以在Preferences对话框中设置默认启动参数。如图2所示。这样在新建立的Android工程中就自动加入了装载sdcard虚拟文件的命令行参数。
插件带的DDMS透视图。如图4所示。
图4
右上角的几个按钮可以删除、添加文件。
如果不使用DDMS插件,或不在eclipse里工作,也可以使用其他工具来操作sdcard
虚拟设备。如在windows下,可以使用mtools,该软件可以从如下地址下载:
https://www.doczj.com/doc/4a14516479.html,/nokiaguy/winima81.rar
安装完后,用mtools打开mycard.img,就会看到相应的目录和文件。如图5所示。
图5
十六.RadioGroup
先需要:
import android.widget.RadioButton;
import android.widget.RadioGroup;
接下来:
private RadioButton RadioButton01;
private RadioButton RadioButton02;
private RadioGroup RadioGroup01;
RadioButton01 = (RadioButton)findViewById(R.id.RadioButton01); RadioButton02 = (RadioButton)findViewById(R.id.RadioButton02); RadioGroup01 = (RadioGroup)findViewById(R.id.RadioGroup01); RadioGroup01.setOnCheckedChangeListener(new
RadioGroup.OnCheckedChangeListener()
{
public void onCheckedChanged(
RadioGroup group,
int checkedId) {
if(checkId== RadioButton01.getId ())
Log.e("TestDemo","选择的是RadioButton01");
else if(checkId== RadioButton02.getId ())
Log.e("TestDemo","选择的是RadioButton02");
else if(checkId==-1)
Log.e("TestDemo","啥都没有选");
}
}
这样,当选项发生改变时,都会进入onCheckedChanged()打印信息,另外一种方式是可以再某个button响应按键中做,例如
int checkId=RadioGroup01.getCheckedRadioButtonId();
if(checkId== RadioButton01.getId ())
Log.e("TestDemo","选择的是RadioButton01");
else if(checkId== RadioButton02.getId ())
Log.e("TestDemo","选择的是RadioButton02");
else if(checkId==-1)
2
或者
RadioGroup01.setOnCheckedChangeListener(mChangeRadio);
private RadioGroup.OnCheckedChangeListener mChangeRadio = new
RadioGroup.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(RadioGroup group, int checkedId)
{
if(checkedId==RadioButton01.getId())
{
Log.e("TestDemo","选择的是RadioButton01");
}
else if(checkedId==RadioButton02.getId())
{
Log.e("TestDemo","选择的是RadioButton02");
}
}
};
十七.Spinner应用
先需要
import android.widget.ArrayAdapter;
import android.widget.Spinner;
1.下拉框数据在程序中定义
private static final String[] countriesStr =
{ "北京市", "上海市", "天津市", "重庆市" ,"北京市1", "上海市1", "天津市1", "重庆市1" ,"北京市2", "上海市2", "天津市2", "重庆市2" };
private Spinner mySpinner;
private ArrayAdapter
mySpinner = (Spinner) findViewById(R.id.mySpinner);
allCountries = new ArrayList
for (int i = 0; i < countriesStr.length; i++)
{
allCountries.add(countriesStr[i]);
}
adapter = new ArrayAdapter
https://www.doczj.com/doc/4a14516479.html,yout.simple_spinner_item, allCountries);
/* myspinner_dropdown为自定义下拉菜单样式定义在res/layout目录下 */
adapter.setDropDownViewResource(https://www.doczj.com/doc/4a14516479.html,yout.simple_spinner_d ropdown_item);//myspinner_dropdown
/* 将ArrayAdapter添加Spinner对象中 */
mySpinner.setAdapter(adapter);
/* 将mySpinner添加OnItemSelectedListener */
mySpinner.setOnItemSelectedListener
(new Spinner.OnItemSelectedListener()
{
@Override
public void onItemSelected
(AdapterView> arg0, View arg1, int arg2,
long arg3)
{
/* 将所选mySpinner的值带入myTextView中 */
myTextView.setText("选择的是" + adapter.getItem(arg2));
/* 将mySpinner显示 */
arg0.setVisibility(View.VISIBLE);
}
@Override
public void onNothingSelected(AdapterView> arg0)
{
// TODO Auto-generated method stub
}
});
添加记录:
String newCountry = edtCountry.getText().toString();
/* 先比较添加的值是否已存在,不存在才可添加 */
for (int i = 0; i < adapter.getCount(); i++)
{
if (newCountry.equals(adapter.getItem(i)))
{
return;
}
}
if (!newCountry.equals(""))
{
/* 将值添加至adapter */
adapter.insert(newCountry,0);
/* 取得添加的值的位置 */
int position = adapter.getPosition(newCountry);
/* 将Spinner选择在添加的值的位置 */
mySpinner.setSelection(position);
/* 将myEditText清空 */
edtCountry.setText("");
}
删除记录:
if (mySpinner.getSelectedItem() != null)
{
/* 删除mySpinner的值 */
adapter.remove(mySpinner.getSelectedItem().toString());
/* 将myEditText清空 */
edtCountry.setText("");
if (adapter.getCount() == 0)
{
/* 将myTextView清空 */
myTextView.setText("");
}
}
注意:
如果用的是
adapter = new ArrayAdapter
https://www.doczj.com/doc/4a14516479.html,yout.simple_spinner_item, countriesStr);
则不可以添加删除;
2.下拉框数据信息从xml文件中导入
ArrayAdapter
ArrayAdapter.createFromResource(this,R.array.countries,https://www.doczj.com/doc/4a14516479.html,yo ut.simple_spinner_item);
arrayAdapter.setDropDownViewResource(https://www.doczj.com/doc/4a14516479.html,yout.simple_spin ner_dropdown_item);
//将arrayAdapter添加到Spinner中去
newspinner.setAdapter(arrayAdapter);
/*删除Spinner中的值*/
Newspinner.remove(Newspinner.getSelectedItem().toString);
/*添加Spinner中的值newCountry 是个字符串*/
Newspinner.add(newCountry);
}
//Array.xml文件的写法
十八.文件处理
1.SharedPreferences
数据量比较小的时候,一般就是密码…的保存用SharedPreferences
该文件是在data/data/package name/shared_prefs/aa.xml中的
写数据
//首先获取一个SharedPreferences对象
SharedPreferences settings = getSharedPreferences("aa", 0); aa表示文件名,0表示模式
settings.edit()
开始编辑
.putString(NAME, fileheight.getText().toString())
NAME相当于标示符,第二个参数就是要保存的数据
.putString(PASSWORD, fileweight.getText().toString()) PASSWORD相当于标示符,第二个参数就是要保存的数据
.commit();
相当于保存起来
取出数据
SharedPreferences settings = getSharedPreferences("aa",0); //获取一个SharedPreferences对象
String name = settings.getString(NAME, "");
//取出保存的NAME,如果不存在就用后面第二个参数作为返回值
String password = settings.getString(PASSWORD, "");
//取出保存的PASSWORD,如果不存在就用后面第二个参数作为返回值
2.Files文件路径data/data/package name/files/new1
import android.app.Activity;
import android.os.Bundle;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/*
Android支持四种数据存储方式,分别是Preference, File, DataBase, Content Provider 。先说下Preference,File,DataBase这三种方式分别对应的目录是
/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database。在Android中通常使用File存储方式是用Context.openFileOutput(String fileName,int mode)和
Context.openFileInput(String fileName)。
Context.openFileOutput(String fileName, int mode)生成的文件自动存储在
/data/data/Package Name/files目录下,其全路径是/data/data/Package
Name/files/fileName。这里的参数fileName不可以包含路径分割符(如"/")。通常来说,这种方式生成的文件只能在这个apk内访问。但这个结论是指使用
Context.openFileInput(String fileName)的方式。使用这种方式,每个apk只可以访问自己的/data/data/Package Name/files目录下的文件,原因很简单,参数fileName 中不可以包含路径分割符,Android会自动在/data/data/Package Name/files目录下寻找文件名为fileName的文件。
但是如果你直接使用这个File,那么这个File在其它apk中也是可以访问的,
代码如下
File file = new File("/data/data/Package Name/files/fileName");
另外还有一个方法可以改变这个生成文件的权限。可以直接在Java代码中执行Linux命令,毕竟Android归根到底也是Linux .代码如下:
Process process = Runtime.getProcess().exec("chmod 666
/data/data/Package Name/files/fileName");
process.waitFor();
* 在android中文件的都路径都在固定的路径下面操作,若要使用已有文件
* 在程序第一次运行时将该文件拷贝文件到data/data/该包名/files/目录下。
* 接下来可以用getFilesDir()取得这个目录路径来构造整个文件的路径
例如
File file = new File(getFilesDir(),"new.txt");
try
{//读取输入流
FileInputStream input = new FileInputStream(file);
}
catch (FileNotFoundException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}