2011年6月15日

使用內部儲存空間

你可以直接存放檔案在裝置的內部儲存空間,預設存放在內部儲存空間的檔案只有你的程式可以存取。當使用者移除你的程式時,這些檔案也會一併被移除。

寫出檔案
呼叫openFileOutput()傳入檔名和操作模式。傳回一個FileOutputStream。
String FILENAME = "hello_file";
String string = "hello world!";
 
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
MODE_PRIVATE產生或覆蓋檔案,私有
MODE_APPEND增添檔案
MODE_WORLD_READABLE外界可讀取
MODE_WORLD_WRITEABLE外界可寫入

讀取檔案
呼叫openFileInput()傳入檔名,傳回一個FileInputStream。
也可以讀取存放在 res/raw/目錄中的檔案,呼叫openRawResource(),傳入 R.raw. ,傳回一個InputStream(只能讀取無法寫入)。

其他相關函數
getFilesDir()
Gets the absolute path to the filesystem directory where your internal files are saved.
getDir()
Creates (or opens an existing) directory within your internal storage space.
deleteFile()
Deletes a file saved on the internal storage.
fileList()
Returns an array of files currently saved by your application.

RadioButton用法

In AndroidManifest.xml宣告如下:
        ....
        <RadioGroup 
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:checkedButton="@+id/horizontalRB"
            android:gravity="center_horizontal"
        >
          <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:text="@string/hor"
            android:textColor="@color/black"
            android:id="@id/horizontalRB"          />
          <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:textColor="@color/black"
            android:text="@string/ver"
            android:id="@+id/verticalRB"          />
        RadioGroup>
         ...
在java程式中取值,用Intent帶值putExtra呼叫其他Activity。
        RadioButton rb1=(RadioButton)findViewById(R.id.horizontalRB);
        RadioButton rb2=(RadioButton)findViewById(R.id.verticalRB);        
 
        Intent intent = new Intent();
        if (rb2.isChecked())
            intent.putExtra("vertical",true);
        else
            intent.putExtra("vertical",false);
 
        intent.setClass(getBaseContext(), main.class);
        startActivity(intent);

2011年6月9日

Layout依比例%分配寬度

類似html中的%width語法,android layout中也有相對應的layout_weight和weightSum.
    <LinearLayout  ...  >
        <TextView ...  android:layout_weight="1"  />
        <TextView ...  android:layout_weight="1"  />
        <TextView ...  android:layout_weight="1"  />
    </LinearLayout>
 
(... 省略)

觸控縮放Touch Zooming WebView

設定Layout和程式權限android.permission.INTERNET
In main.xml
xml version="1.0" encoding="utf-8"?>
<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical" android:layout_width="fill_parent"
      android:layout_height="fill_parent">
    <WebView
      android:id="@+id/MyIE"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" />
</LinearLayout>
 
In AndroidManifest.xml
....
<uses-permission android:name="android.permission.INTERNET" />
...
呼叫WebView的getSettings()得到WebSettings物件來進行設定。
   WebView ie;
   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main );
 
       // 取得 WebView物件 
       ie = (WebView) findViewById( R.id.MyIE);        
       // 取得 WebSettings物件 
       WebSettings webSettings = ie.getSettings();  
       // 支援JavaScript
       webSettings.setJavaScriptEnabled(true);             
       // 支援Zoom
       webSettings.setSupportZoom(true);                    
       webSettings.setBuiltInZoomControls(true);
   }

Android 程式的生命週期測試

在每個生命週期事件加上一個Toast訊息,來得知呼叫的順序。
第一次執行程式時,進行起始啟動 OnCreate() > OnStart() > OnResume()

暫停Pause

按下HOME按鈕 OnPause() > OnStop(),程式只是暫停而停止,
當再次啟動程式時 OnReStart() > OnStart() > OnResume()
  • 當呼叫Intent時,程式會先暫停(OnPause() > OnStop(),然後返回時 OnReStart() > OnStart() > OnResume())。

結束Destroy

按下BACK按鈕或呼叫finish()方法,則會真正的結束程式 OnPause() > OnStop() > onDestroy()
當再次執行程式時,就如同起始啟動
  • 旋轉螢幕時,程式會先結束,然後再啟始起動(OnPause() > OnStop() > onDestroy() > OnCreate() > OnStart() > OnResume())。

機器休眠待機時

此時可分為兩種情形
  • 程式在執行狀態:經過多個Pause,Resume,Stop事件後,最後會Destory。當機器醒來時,程式會重新起始啟動OnCreate() > OnStart() > OnResume()。
  • 程式在暫停狀態:當機器醒來重新執行程式時,就如同從暫停模式回來一樣 OnReStart()>OnStart()>OnResume()。
 @Override
  public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       Toast.makeText(this, "onCreate", Toast.LENGTH_LONG).show();
   }
 @Override
 protected void onRestart() {
  // TODO Auto-generated method stub
  super.onRestart();
  Toast.makeText(this, "onRestart", Toast.LENGTH_LONG).show();
 }
 @Override
 protected void onStart() {
  // TODO Auto-generated method stub
  super.onStart();
  Toast.makeText(this, "onStart", Toast.LENGTH_LONG).show();
 }
 @Override
 protected void onResume() {
  // TODO Auto-generated method stub
  super.onResume();
  Toast.makeText(this, "onResume", Toast.LENGTH_LONG).show();
 }
 @Override
 protected void onPause() {
  // TODO Auto-generated method stub
  super.onPause();
  Toast.makeText(this, "onPause", Toast.LENGTH_LONG).show();
 }
 @Override
 protected void onStop() {
  // TODO Auto-generated method stub
  super.onStop();
  Toast.makeText(this, "onStop", Toast.LENGTH_LONG).show();
 }
@Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  Toast.makeText(this, "onDestroy", Toast.LENGTH_LONG).show();
 }

全螢幕且不顯示標題列

requestWindowFeature(...)可讓標題欄不顯示,而getWindow().setFlags(...)可以設定全螢幕顯示。

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  WindowManager.LayoutParams.FLAG_FULLSCREEN);        
 
        setContentView(R.layout.main);
        ...
或在AndroidManifest.xml的Activity區塊中插入:
    <application android:icon="@drawable/wusjp" android:label="@string/app_name" >
        <activity   
                  android:theme="@android:style/Theme.NoTitleBar"
                  ...                                                                           
        >
         ...    
        activity>
    application>

2011年6月6日

試用Windows Live Writer

LinearLayout mLinearLayout;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Create a LinearLayout in which to add the ImageView
mLinearLayout = new LinearLayout(this);

// Instantiate an ImageView and define its properties
ImageView i = new ImageView(this);
i.setImageResource(R.drawable.my_image);
i.setAdjustViewBounds(true); // set the ImageView bounds to match the Drawable's dimensions
i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));

// Add the ImageView to the layout and set the layout as the content view
mLinearLayout.addView(i);
setContentView(mLinearLayout);
}

2011年6月2日

Android: MediaPlayer 播放Asset中的檔案

因為Security保密原因media server 無法存取你的程式私有資料目錄,
所以你必須在程式中開檔案,然後使用setDataSource(fd)
將檔案Filedescriptor傳給media player。
當然也可將檔案複製到SD卡,然後播其路徑。

AssetFileDescriptor afd = getAssets().openFd("test.MP3"); 
mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
mp.prepare();
mp.start();
afd.close();