2012年7月31日 星期二

Android:VideoView以及MediaPlayer撥放音訊

音訊檔以及影片檔要放置專案 res/raw

package com.mediaplayer;

import ...

public class mediaPlayer extends Activity {
ListView lv;
Spinner sp;
CharSequence[] activity = { "播放影片", "播放音樂從專案", "播放音樂從SD卡" };

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

lv = (ListView) findViewById(R.id.listView1);
                //建立以及設定接口
ArrayAdapter ada = new ArrayAdapter(this,
android.R.layout.simple_list_item_1, activity);
lv.setAdapter(ada);
                //建立監聽物件
lv.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long id) {
// TODO Auto-generated method stub
switch (position) {
case 0:
Intent vintent = new Intent(mediaPlayer.this,
video.class);
startActivity(vintent);
break;
case 1:
Intent aintent = new Intent(mediaPlayer.this, Audio.class);
startActivity(aintent);
break;
case 2:
Intent a2intent = new Intent(mediaPlayer.this, Audio2.class);
startActivity(a2intent);
break;
}

}

});

}


}
package com.mediaplayer;

import ...
//使用VideoView撥放影片
public class video extends Activity {
VideoView vv;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.videoview);
vv=(VideoView)findViewById(R.id.videoView1);
//影片檔在SD Card寫法
//Uri uri=Uri.parse("file:///sdcard/navy.3gp");
//影片在專案檔中
Uri uri=Uri.parse("android.resource://com.mediaplayer/" + R.raw.navy);
//設定路徑
vv.setVideoURI(uri);
//建立媒體控制器
MediaController mc=new  MediaController(this);
//將媒體控制器設給VideoView
vv.setMediaController(mc);
vv.requestFocus();
//播放
vv.start();
}

}


package com.mediaplayer;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.widget.TextView;
//撥放於專案內之音訊檔
public class Audio extends Activity {
// 宣告MediaPlayer類別變數
MediaPlayer medi;
String path;
TextView tex;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.audio);
tex = (TextView) findViewById(R.id.textView1);
//撥放音訊檔來自於專案內較簡單,只要使用MediaPlayer.create(Content, 
                 R.raw.XX)建立物件
//再start()播放即可
medi = MediaPlayer.create(this, R.raw.aa);
medi.start();

tex.setText("playing...");

}

@Override
//記得要在 onDestroy()時將MediaPlayer物件給release掉
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
medi.release();

}

}
package com.mediaplayer;

import ...

public class Audio2 extends Activity {
TextView tex;
// SD卡上音訊檔的路徑
final private String path = "/sdcard/song11.mp3";
MediaPlayer mp;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.audio2);
tex = (TextView) findViewById(R.id.textView1);

// 建立物件,方法與音訊檔在專案內不同
mp = new MediaPlayer();
try {
// 設定路徑
mp.setDataSource(path);
// 狀態由Initialized到Prepare狀態
mp.prepare();
// 狀態由prepare狀態到start狀態
mp.start();
tex.setText("playing...");
} catch (Exception e) {
Toast.makeText(this, "無法撥放音訊", Toast.LENGTH_SHORT).show();

}

}

@Override
// 記得release MediaPlayer
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mp.release();
}

}




2012年7月25日 星期三

Android:SQLite 新增 修改 刪除 列表 查詢

SQLite會用到兩個很重要的類別物件,SQLiteOpenHelper負責建立資料庫以及資料表
以及SQLiteDatabase負責資料的新增 修改 刪除 等操作

首先要新建一個class extends SQLiteOpenHelper


package com.sqltest;

import ....
public class Mydbhelper extends SQLiteOpenHelper {
static String dbname = "mydb";
static int version = 1;
static String dbtableSQL = "CREATE TABLE mytable ( _id integer primary key not null,"
+ "name text not null,sex text,addr text)";

// 內建的建構子,用來建立資料庫,但要傳入的參數有點多,所以我們改用自己的
public Mydbhelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
    //我們自己的建構子只需傳入Context頁面即可
public Mydbhelper(Context context) {
super(context, dbname, null, version);
// TODO Auto-generated constructor stub
}
    //建立資料表
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(dbtableSQL);

}
    //更新資料表
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub

}

}

主頁面程式

package com.sqltest;

import ...
public class MainActivity extends Activity {
EditText etname, etsex, etaddr;
TextView show;

SQLiteDatabase dbwr;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

etname = (EditText) findViewById(R.id.editText1);
etsex = (EditText) findViewById(R.id.editText2);
etaddr = (EditText) findViewById(R.id.editText3);
show = (TextView) findViewById(R.id.textView4);
        /*建立繼承SQLiteOpenHelper之類別物件,主要用來建構
出用於修改資料之SQLiteDatabase類別物件*/
Mydbhelper helper = new Mydbhelper(this);
dbwr = helper.getWritableDatabase();
Toast.makeText(this, "建立資料庫成功", 3000).show();
}
    //記得結束資料串流,避免資料遺失
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
dbwr.close();
}
        //修改
public void renewbut(View v) {
if (!etname.getText().toString().equals("")
&& !etaddr.getText().toString().equals("")) {
//ContentValues物件用來攜帶資料進資料表裡
ContentValues cv = new ContentValues();
//ContentValues.put("資料庫欄位",value)
cv.put("addr", etaddr.getText().toString());
//更新資料使用內建的API,SQLiteDatabase相關資料庫操作都會回傳一個long,可用來判斷是否有操作成功
//update(String table, ContentValues values, String whereClause, String[] 
whereArgs)
                        //whereClause 對應到SQL語法: name='XXX',SQL是用單引號
long check = dbwr.update("mytable", cv, "name='"
+ etname.getText().toString() + "'", null);
if (check > 0)
Toast.makeText(this, "修改成功", 3000).show();
else
Toast.makeText(this, "修改失敗", 3000).show();

} else {

Toast.makeText(this, "清輸入姓名以及地址", 3000).show();
}

}
       //刪除
public void delbut(View v) {
if (!etname.getText().toString().equals("")) {
long check = dbwr.delete("mytable", "name='"
+ etname.getText().toString() + "'", null);
if (check > 0) {
Toast.makeText(this, "刪除成功", 3000).show();
} else {
Toast.makeText(this, "刪除失敗", 3000).show();
}

} else {
Toast.makeText(this, "請輸入刪除資料之姓名", 3000).show();
}

}
       //新增
public void newbut(View v) {
ContentValues cv = new ContentValues();
cv.put("name", etname.getText().toString());
cv.put("sex", etsex.getText().toString());
cv.put("addr", etaddr.getText().toString());
long check = dbwr.insert("mytable", null, cv);
if (check > 0) {
Toast.makeText(this, cv.toString() + "新增成功", Toast.LENGTH_SHORT)
.show();

} else {
Toast.makeText(this, "新增失敗", Toast.LENGTH_SHORT).show();
}
}
       //查詢
public void querybut(View v) {
if (!etname.getText().toString().equals("")) {
//宣告一個Cursor變數,類似ResultSet,像是一個從資料表中得到的資料表單
Cursor c = null;
//Cursor表單中,擁有的欄位,必須與原資料表欄位名稱符合
String[] colum = { "name", "sex", "addr" };
c = dbwr.query("mytable", colum, "name='"
+ etname.getText().toString() + "'", null, null, null, null);
//針對Cursor變數進行操作,用迴圈將裡面的資料提領出來
if (c.getCount() > 0) {
String st1 = "";
//移動到第一筆
c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
st1 = ("姓名:  " + c.getString(0) + "性別:  " + c.getString(1)
+ "地址:  " + c.getString(2) + "\n");
//移動到下一筆
c.moveToNext();
}
show.setText(st1);
Toast.makeText(this, "共有" + c.getCount() + "筆紀錄", 3000).show();
} else {
Toast.makeText(this, "沒有資料...", 3000).show();
}

} else {
Toast.makeText(this, "請輸入欲查詢之姓名", 3000).show();
}
}

//展示
            public void showbut(View v) {

Cursor c = null;
String[] colum = { "name", "sex", "addr" };
c = dbwr.query("mytable", colum, null, null, null, null, null);
if (c.getCount() > 0) {
String st1 = "";

c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
st1 += ("姓名:  " + c.getString(0) + "性別:  " + c.getString(1)
+ "地址:  " + c.getString(2) + "\n");
c.moveToNext();
}
show.setText(st1);

Toast.makeText(this, "共有" + c.getCount() + "筆紀錄", 3000).show();
} else {
Toast.makeText(this, "沒有資料...", 3000).show();
}

}

}

2012年7月24日 星期二

Android:儲存資料到SD卡

與JAVA中儲存資料至File以及取回概念以及用法相同

<Android Manifest>
要記得將SD卡寫取資料的權限打開
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<Source Code>

package com.savesdtest;

import ....

public class MainActivity extends Activity {
//datapath為SD卡底下目的資料夾,mydata為儲存資料的TXT檔
        String datapath = "/data1";
String mydata = "note.txt";
File file;

EditText edi;
Button save, get;
TextView show;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

edi = (EditText) findViewById(R.id.editText1);
save = (Button) findViewById(R.id.button1);
get = (Button) findViewById(R.id.button2);
show = (TextView) findViewById(R.id.textView2);
        //利用Environment查看外部儲存空間的狀態是否可讀寫
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {

} else {
           /*Environment.getExternalStorageDirectory()傳回File,File.getAbsolutePath()
得到SD卡路徑*/
String path = Environment.getExternalStorageDirectory()
.getAbsolutePath() + datapath;
//建立這一個暫時的File物件主要是要用在底下的if判斷式,File.mkdir()
File sdcardPath = new File(path);
if (!sdcardPath.exists()) {
sdcardPath.mkdir();
Toast.makeText(this, path + "已建立", Toast.LENGTH_SHORT).show();
}
file = new File(path + mydata);
}
save.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub

try {
//JAVA io包裝,位元->字元->字串
FileOutputStream fos = new FileOutputStream(file, true);
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
bw.write(edi.getText().toString());
bw.flush();

bw.close();

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

});

get.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
String str1 = "", str2 = "";
try {
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
while ((str1 = br.readLine()) != null) {
str2 += str1;
}
show.setText("結果" + str2);
br.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

});
}

}

2012年7月19日 星期四

Android:利用FileOutputStream & FileInputStream儲存資料


package com.savefile;

import....

public class MainActivity extends Activity {
Button saveBut,getBut;
EditText edi;
TextView show;
String filename="my.file";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        saveBut=(Button)findViewById(R.id.button1);
        getBut=(Button)findViewById(R.id.button2);
        edi=(EditText)findViewById(R.id.editText1);
        show=(TextView)findViewById(R.id.textView1);
        saveBut.setOnClickListener(new OnClickListener(){

public void onClick(View arg0) {
// TODO Auto-generated method stub
try {
//openFileOutput(儲存的檔名,字串連接模式),MODE_APPEND不會覆蓋
                                         掉之前儲存值
FileOutputStream fos=openFileOutput(filename,MODE_APPEND);
//位元組串流轉換為字元組串流,不一定要寫,
//有書會用BufferOutputStream,但雖然會提升效能,但此法會將資料寫
                                           進陣列中,使用上較麻煩
OutputStreamWriter osw=new OutputStreamWriter(fos);
//在這邊我們用BufferedWriter來提升效能
BufferedWriter bw=new BufferedWriter(osw);
bw.write(edi.getText().toString());
bw.flush();
bw.close();
Toast.makeText(MainActivity.this,edi.getText().toString()+"is saved..." , Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
       
        });
        getBut.setOnClickListener(new OnClickListener(){

public void onClick(View arg0) {
// TODO Auto-generated method stub
try {
FileInputStream fis=openFileInput(filename);
InputStreamReader isr=new InputStreamReader(fis);
//使用BufferedReader可以使用readLine()方法非常好用,並可以提升效率
BufferedReader br=new BufferedReader(isr);
String str1="",str2="";
//Java常見用法
while((str1=br.readLine())!=null){
str2+=str1;
show.setText("儲存之值"+str2);
      br.close( );
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
       
        });
    }

 
 
}

Android:SharedPreference儲存資料

一般來說,在設計上也常將寫入檔案的動作寫在onPause( )中
而取值動作則寫在onCreate( )中,在UI介面程式設定完之後


package ....;

import ....
public class SharePreActivity extends Activity {
/** Called when the activity is first created. */
SharedPreferences sp;
EditText show;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// MODE_PRIVATE=0,可以直接以0表示
//getSharedPreferences()會回傳一個SharedPreferences物件
sp = getSharedPreferences("DATA", MODE_PRIVATE);
show = (EditText) findViewById(R.id.editText1);
}

public void saveonclick(View v) {
int data = Integer.parseInt(show.getText().toString());
//SharedPreferences.edit()取得Editor物件,
//使用Editor的putXXX()寫入,而此方法都會再回傳Editor物件,因此用串鏈寫法
//結束要加上commit()方法
sp.edit().putInt("datakey", data).commit();
Toast.makeText(this, String.format("%d is saved...", data),
Toast.LENGTH_LONG).show();

}

public void page2onclick(View v) {
startActivity(new Intent(this, Page2.class));

}
}

package com.wu;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class Page2 extends Activity {
SharedPreferences sp;
TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.page2);
//如果是在不同的活動頁面,必須在宣告並取得SharedPreferences物件
//0=MODE_PRIVATE
sp = getSharedPreferences("DATA", 0);
show=(TextView)findViewById(R.id.textViewpage2);
}
public void readonclick(View v){
//sp.getInt("datakey", 0):使用getXXX(Key,default values)取回儲存之值
show.setText(String.format("取回之值為%d",sp.getInt("datakey", 0) ));
}
}


2012年7月17日 星期二

Android:Broadcast Intent與Broadcast Receiver

<AndroidManifest.xml>


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.broadcast"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".Brocast"
            android:label="@string/title_activity_brocast" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <--可由manifest圖形化介面設定-->
        <receiver android:name=".Myreceiver" >
          <--目前只知道要用key的...-->
            <intent-filter>
                <action android:name="com.broadcast"/>
            </intent-filter>
                
        </receiver>
    </application>

</manifest>



package com.broadcast;

import ....

public class Brocast extends Activity {
String s;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_brocast);
    }

 public void onclick(View v){
        //建立一個Intent物件,並指定要廣播的訊息,PS:這個廣播訊息必需要至Manifest中註冊
           <intent-filter>
                <action android:name="com.broadcast"/>
            </intent-filter>
Intent intent=new Intent("com.broadcast");
s="hello,this is broadcast";
intent.putExtra("key", s);
         //廣播此Intent物件
sendBroadcast(intent);
 }
   
}

<建立一個新class>



package com.broadcast;

import ....

public class Myreceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String data=intent.getStringExtra("key");
Toast.makeText(context, "值為"+data,3000).show();

}

}





2012年7月16日 星期一

Android:要求被呼叫的Activity回傳資料

記得要先到manifest中註冊新頁面


package com.intentpage;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class IntentPageActivity extends Activity {
    /** Called when the activity is first created. */
EditText edi1,edi2;
TextView show;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        edi1=(EditText)findViewById(R.id.editText1);
        edi2=(EditText)findViewById(R.id.editText2);
        show=(TextView)findViewById(R.id.textView2);
    }
    //第一個按鈕到page2
    public void butonclick(View v){
    int one=0,two=0;
    try{
    one=Integer.parseInt(edi1.getText().toString());
    two=Integer.parseInt(edi2.getText().toString());
    }catch(Exception e){
   
    }
   
    Intent intent=new Intent(IntentPageActivity.this,Page2.class);
    intent.putExtra("onekey", one);
    intent.putExtra("twokey", two);
   
   
    //要求對方一定要傳回值,requestCode為100
    startActivityForResult(intent,100);
    }
   //第二個按鈕,將1000數字傳到page3

    public void onclick(View v){
     Intent page3Intent=new Intent(this,page3.class);
     Bundle bundle=new Bundle();
     bundle.putInt("key", 1000);
     page3Intent.putExtras(bundle);
      //要求對方一定要傳回值,requestCode為103
     startActivityForResult(page3Intent,103);
    }

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
               //使用requestCode來判斷傳回的物件是從哪個Activity所傳回的
switch(requestCode){
case 100:
if(resultCode==RESULT_OK){
Bundle bundle=data.getExtras();
int result=bundle.getInt("replykey");
show.setText("等於"+result);
break;
}

case 103:
if(resultCode==RESULT_OK){
Bundle bundle=data.getExtras();
int resultpage3=bundle.getInt("page3key");
show.setText("等於"+resultpage3);
break;
}

}

}
 
}

package com.intentpage;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Page2 extends Activity {
TextView tex;
Button but;
int result;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.page2);
tex=(TextView)findViewById(R.id.textView);
but=(Button)findViewById(R.id.bittonpage2);
//由於從上個Activity並沒有使用Bundle物件來傳遞資料,因此不用getExtras( )來取得
                Bundle物件
               Intent obj=this.getIntent();


int one=0,two=0,mod=0;

        //Intent.getXXXExtra("key",default value)
one=obj.getIntExtra("onekey", 0);
two=obj.getIntExtra("twokey", 0);

int one1=one;int two1=two;
while(two!=0){
mod=one%two;
one=two;
two=mod;
}
result=one;
tex.setText(String.format("%d與%d之最大公因數為%d", one1,two1,one));
but.setOnClickListener(new OnClickListener(){

public void onClick(View arg0) {
// TODO Auto-generated method stub

//已經知道是要傳回哪個頁面,所以就不用標示來源目的了
Intent replyIntent=new Intent();
Bundle bundle=new Bundle();
bundle.putInt("replykey", result);
replyIntent.putExtras(bundle);
                                //回傳帶有資料的Intent物件以及ResultCode,ResultCode常見為RESULT_OK
                                   或是RESULT_CANCEL
setResult(RESULT_OK,replyIntent);
Page2.this.finish();
}

});
}


}

package com.intentpage;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import android.view.View;

public class page3 extends Activity {
int page3;
int x;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.page3);
Bundle bundle=this.getIntent().getExtras();
x=bundle.getInt("key");
((TextView)findViewById(R.id.textViewpage3)).setText("傳來值為"+x);
}

public void onclick(View v) {
Intent page3Intent=new Intent();
Bundle bundle=new Bundle();
page3=x+1000;
bundle.putInt("page3key",page3 );
page3Intent.putExtras(bundle);
setResult(RESULT_OK,page3Intent);
page3.this.finish();

}
}


Android:Intent與Bundle,建立新的活動頁面


package com.intentpage;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class IntentPageActivity extends Activity {
    /** Called when the activity is first created. */
EditText edi1,edi2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        edi1=(EditText)findViewById(R.id.editText1);
        edi2=(EditText)findViewById(R.id.editText2);
    }
    public void butonclick(View v){
    int one=0,two=0;
    try{
    one=Integer.parseInt(edi1.getText().toString());
    two=Integer.parseInt(edi2.getText().toString());
    }catch(Exception e){
   
    }
    //建立Bundle物件,並讓Bundle攜帶資料
    Bundle bundle=new Bundle();
    //putXXX("key",values)
    bundle.putInt("onekey", one);
    bundle.putInt("twokey", two);
    //建立Intent物件,第一個參數為此活動頁面,第二個參數為目標活動頁面
    Intent intent=new Intent(IntentPageActivity.this,Page2.class);
    //使用putExtras()方法讓Intent攜帶Bundle物件一起到目標活動頁面
    intent.putExtras(bundle);
    startActivity(intent);
    }
}

---------------------------------------------------------------------------------------------------------
在manifest中必須建立此頁面

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".IntentPageActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Page2"></activity>
    </application>

------------------------------------------------------------------------------------------------------------




package com.intentpage;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Page2 extends Activity {
TextView tex;
Button but;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
                //要將page2的XML layout與結合
setContentView(R.layout.page2);
tex=(TextView)findViewById(R.id.textView);
but=(Button)findViewById(R.id.bittonpage2);
/*當透過Intent傳到新的Activity後,只要使用Activity.getIntent()就可以得到傳過來 
               的 Intent物件,接著再使用gerExtras()就可以得到Intent物件所附帶的Bundle物件*/
Bundle bundle=this.getIntent().getExtras();
int one=0,two=0,mod=0;
                //取回Bundle中攜帶的資料,以Key值來取回
one=bundle.getInt("onekey");
two=bundle.getInt("twokey");
int one1=one;int two1=two;
while(two!=0){
mod=one%two;
one=two;
two=mod;
}
tex.setText(String.format("%d與%d之最大公因數為%d", one1,two1,one));
but.setOnClickListener(new OnClickListener(){

public void onClick(View arg0) {
// TODO Auto-generated method stub
Page2.this.finish();
}

});
}


}




Android:Intent

類型I (比較單純)

// 建構子參數傳入一個用字串表示的動作,例如:Intent.ACTION_VIEW,Intent.ACTION_CALL等等...以及一個Uri類別物件,常以Uri.parse(String)來取得

1. Intent intent=new Intent(String action, Uri uri)
ex:Intent intent=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.google.com"));
    Intent geo=new Intent(Intent.ACTION_VIEW,Uri.parse("geo:23.962411,120.581818"));

//啟動
2. startActivity(intent);

-----------------------------------------------------------------------------------------


//建構子參數只傳入一個字串代表的動作
1. Intent intent=new Intent(String action)
ex:挑選一個聯絡人

//Intent動作為挑選
Intent contact=new Intent(Intent.ACTION_PICK);
//設定Intent的mime 類型
contact.setType(ContactsContract.Contacts.CONTENT_TYPE);
//啟動,startActivityForResult( ) 帶有兩個參數,Intent物件以及 request code
startActivityForResult(contact,100);

//當被呼叫的Activity結束後,系統會將她回傳三個參數,分別為requestCode,resultCode
以及系統回傳的Intent物件
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
                //當requestCode為100,且回傳的resultCode為RESULT_OK此常數時
if(requestCode==100){
if(resultCode==RESULT_OK){
                                //利用第三個參數中的Intent物件參數取回資料
String uri=data.getData().toString();
Toast.makeText(this, uri, 50000).show();
                                //再建立一個Intent物件執行瀏覽或是編輯聯絡人動作
//Intent intent=new Intent(Intent.ACTION_EDIT,Uri.parse(uri));
Intent intent=new Intent(Intent.ACTION_VIEW,Uri.parse(uri));
startActivity(intent);
}
}

2012年7月10日 星期二

Android:Menu與SubMenu

XML layout
練習用程式,主版面沒有元件

Menu (XML file)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/submenu" android:title="子選單開始">
        <menu>
            <item android:id="@+id/submenu1" android:title="選項1"/>
            <item android:id="@+id/submenu2" android:title="選項2"/>
        </menu>
    </item>
    <item android:id="@+id/fin" android:title="離開"></item>
</menu>


Source Code


package com.menutest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


@Override
//android sdk tool r20之後,只需要由eclipse中將此方法給匯入並改寫即可
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
                //從使用此方法中自帶的item中的.getItemId()直接與Menu與SubMenu之編號來判斷
switch(item.getItemId()){
case R.id.submenu1:
Toast.makeText(MainActivity.this, "子選項1", 3000).show();
break;
case R.id.submenu2:
Toast.makeText(MainActivity.this, "子選項2", 3000).show();
break;
case R.id.fin:
finish();
}
return super.onOptionsItemSelected(item);
}

   
}



Android:Spinner(下拉式選單)以及Adapter(接口)

XML layout:

<Spinner
        android:id="@+id/spinner1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="75dp"
        android:layout_marginTop="63dp" />


XML file (values)利用圖形化介面產生

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="webname">
        <item /><item >Google</item>
        <item >Yahoo</item>
        <item >Mobile01</item>
       
    </string-array>
    <string-array name="website">
        <item />
        <item >http://www.google.com</item>
        <item >http://www.yahoo.com</item>
        <item >http://www.mobile01.com</item>
    </string-array>
   
</resources>


Code



package com.spinner2;


import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;


public class MainActivity extends Activity {
Spinner spi;
String[] webname, website;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spi = (Spinner) findViewById(R.id.spinner1);
//從XML中將預先設定好之string array叫進JAVA程式
webname = getResources().getStringArray(R.array.webname);
website = getResources().getStringArray(R.array.website);
//ArrayAdapter建構子需要三個參數,目的activity,,spinner樣式,以及顯示內容之字串陣列
ArrayAdapter ada = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, webname);
//將Spinner與Adapter接上
spi.setAdapter(ada);
//設定監聽物件
spi.setOnItemSelectedListener(new OnItemSelectedListener() {
            /* arg0 The AdapterView where the selection happened
               arg1 The view within the AdapterView that was clicked
               arg2 The position of the view in the adapter
               arg3 The row id of the item that is selected
               使用arg2可以知道使用者選擇Spinner中item的位置  
               */
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
                           
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(website[arg2]));
startActivity(intent);
}


public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub


}


});
}


}