2011年8月28日

[Android]OnItemClick的使用方法

一、簡介
有人發問說「OnItemClick的使用方法,如何換頁」。
其實方式不難,我們需要了解的地方在於
(1)Activity 和 Activity 之間需要怎麼換頁和傳遞資料。
(2)OnItemClick的使用方式。

二、方法
(1)  Intent:Intent 有兩種基本的用法,似乎取決於使用者需要的是哪一種。

a.顯示的Intent
在建構Intent時已經指定接收者,類似函式調用的方式。


b.隱藏式的Intent
在建構Intent時並沒有指定接收者,之後在傳送



(2)OnItemClick:一個監聽事件。當項目被點選時,就會啟動此函式。


三、程式碼

Activity.java

package tw.test2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Gallery;
import android.widget.Toast;

public class Test2Activity extends Activity {
	private Gallery gallery;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        gallery=(Gallery)findViewById(R.id.gallery);
        
        //希宣告一個類別,用來設定圖片資訊
        ImageAdapter imageAdapter=new ImageAdapter(this);
        
        //加入圖片
        Integer[] mImageIds={R.drawable.icon,R.drawable.ha};
        
        //設定圖片位置
        imageAdapter.setmImageIds(mImageIds);
        
        //圖片高度
        imageAdapter.setHeight(100);
        //圖片寬度
        imageAdapter.setWidth(200);
        
        gallery.setAdapter(imageAdapter);
        
        //當按下圖片時,所觸發的事件
        gallery.setOnItemClickListener(new OnItemClickListener(){

			@Override
			public void onItemClick(AdapterView parent, View view, int position,
					long id) {
				// TODO Auto-generated method stub
				Toast.makeText(Test2Activity.this, "您選的是第"+position+"張圖", Toast.LENGTH_LONG).show();
				
				//換頁
				Intent intent = new Intent();
				intent.setClass(Test2Activity.this, Report.class);
				/*
				 * 這邊是你要帶過去的資料
				 */
				intent.putExtra("test", "第二頁囉");
				startActivity(intent);
			}});
    }
}
ImageAdapter.java
package tw.test2;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
    private Context mContext;
    private Integer width;
    private Integer height;
    private Integer[] mImageIds;

    public ImageAdapter(Context c) {
        mContext = c;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView = new ImageView(mContext);
        //設定圖片來源
        imageView.setImageResource(mImageIds[position]);
        //設定圖片的寬、高
        imageView.setLayoutParams(new Gallery.LayoutParams(width, height));
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        return imageView;
    }

    public Integer getHeight() {
        return height;
    }

    public void setHeight(Integer height) {
        this.height = height;
    }

    public Integer[] getmImageIds() {
        return mImageIds;
    }

    public void setmImageIds(Integer[] mImageIds) {
        this.mImageIds = mImageIds;
    }

    public Integer getWidth() {
        return width;
    }

    public void setWidth(Integer width) {
        this.width = width;
    }

    public int getCount() {
        return mImageIds.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }
}
Report.java
package tw.test2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class Report extends Activity {
      /** Called when the activity is first created. */
 @Override
       public void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
               setContentView(R.layout.report);
               
               Intent intent = this.getIntent();
               String showtest=intent.getStringExtra("test");
               
               Toast.makeText(Report.this,showtest.toString(), Toast.LENGTH_LONG).show();          
               
 }
}
記得加入(AndroidManifest.xml)

2011年8月26日

[Android]以背景服務的方式錄製聲音

一、簡介
現在大部份使用者所看見的執行畫面都是前端的程式(Activity),但是還有很多的服務需要在背景中執行,這個功能則需要使用到Service。
由於背景執行所以是要寫在Service而不是Activity,因此需要在權限頁面(AndroidManifest)中新增一個Service的服務。

二、方法
(1)  Service:這個服務本身是無介面,也並非一個獨立的Process,只是有需要長時間執行的獨立程序為了不影響主程式的運行,就會使用Service。



(2)   MediaRecorder:這個類別主要是 Android錄音錄影所使用到的,詳細資料可以參詳官方網站。

三、程式碼

Activity.java

package tw.Recording;

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;

public class RecordingActivity extends Activity {
	
	private Button start,stop;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        start=(Button)findViewById(R.id.start); 
        stop=(Button)findViewById(R.id.stop);
        
        start.setOnClickListener(new OnClickListener(){
        	//執行背景作業
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(RecordingActivity.this, RecordingService.class);
				           startService(intent);
			}});
        stop.setOnClickListener(new OnClickListener(){
        	
        	//停止背景作業
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(RecordingActivity.this, RecordingService.class);
	            stopService(intent);
			}});
    }
}

Service.java
package tw.Recording;

import java.io.File;
import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;

public class RecordingService extends Service {
	private MediaRecorder mediaRecorder = null;

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override
	//錄音
	public void onStart(Intent intent,int startId)
	{
		//設定錄音檔名	
		String fileName = "test.amr";
		try{
			File SDCardpath=Environment.getExternalStorageDirectory();
			File myDataPath=new File(SDCardpath.getAbsolutePath()+"/download");
			
			if( !myDataPath.exists() ) myDataPath.mkdirs();
			
			File recodeFile = new File(SDCardpath.getAbsolutePath() + "/download/"+fileName);
			mediaRecorder = new MediaRecorder();
			
			//設定音源
			mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
			//設定輸出檔案的格式
			mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
			//設定編碼格式
			mediaRecorder
			.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
			//設定錄音檔位置
			mediaRecorder.setOutputFile(recodeFile.getAbsolutePath());
			mediaRecorder.prepare();
			//開始錄音
			mediaRecorder.start();
		}
		catch(IOException e){
		e.printStackTrace();
		}
		super.onStart(intent, startId);
	}

	@Override
	//停止背景時
	    public void onDestroy() {
		if(mediaRecorder != null) {
			    mediaRecorder.stop();
			    mediaRecorder.release();
			    mediaRecorder = null;
			    }
	        super.onDestroy();
	    }
		

}

AndroidManifest.xml(記得加入)