2011年12月23日星期五

quiz-and-poll (測驗及投票)谷歌開放源代碼項目

quiz-and-poll
利用 Quiz & Poll, 教師及教育工作者可以使用Google Spreadsheets輕易創建測驗和調查的應用程序。 應用程序 Quizzes and Polls 通過 Android App 或嵌入 WebPlayer 分發給學生。 電子表格也包含學生的反應和排序,可用於評估統計學生。

Quiz & Poll是項谷歌開放源代碼項目, 有興趣可以參考: http://code.google.com/p/quiz-and-poll/



2011年12月17日星期六

Android 4.0.3


Galaxy Nexus 才剛推出市場, Android 4 已經成為舊版本!

Google 剛發佈 Android 4.0.3 - 新版本包括了各種對應手機和平板電腦的優化和bug修復, 以及為開發人員提供一些新增的應用程序接口. 新的API級別為15.

Android 4.0.3 將成為冰淇淋三明治(Ice Cream Sandwich)的基礎版本.

此外, Google 同時更新了對應的 SDK Tools (r16), Eclipse 插件 (ADT 16.0.1) 以及 NDK r7.

詳見: Android 開發者博客 - Android 4.0.3 Platform and Updated SDK tools.



2011年12月16日星期五

Android Training (線上 Android 訓練班)


谷歌宣布推出 Android Training 線上訓練班, 一個幫助 Android 開發人員打造更好的 Android 應用程序的線上訓練班.

這些訓練班旨在演示用於解決常見的Android開發問題的最佳做法。每個單元說明要解決一個問題,或實現一個功能的步驟,為開發人員提供豐富實用的代碼片段和示例.


信息來源: Android開發者博客 - Introducing Android Training

2011年12月10日星期六

惠普(hp)開放webOS源碼


惠普(hp)宣布開放 webOS 以及 ENYO (webOS的應用程序框架),成為開放式資源,人人都可以自由應用、改動及開發程式和軟件。

詳細可以瀏覽惠普新聞稿: http://www.hp.com/hpinfo/newsroom/press/2011/111209xa.html

2011年12月9日星期五

添加Android的兼容包 (Android Compatibility package)

如果你看到前文"Honeypad 教程", 並按照 Honeypad Tutorial 做的話, 你可能會遇到編譯錯誤, 例如:
The import android.support cannot be resolved
FragmentActivity cannot be resolved to a type
FragmentActivity error

Android Compatibility package 是一個幫助運行 Android 1.6 後的舊版設備使用 Android 3.0 新功能的軟件包.

要使用 Android Compatibility package, 首先開啟Android SDK Manager, 確定已經安裝Android Compatibility package.
Android SDK Manager

在Package Explorer右擊Properties, 選擇Java Build Path, 再按Add External JARs...鍵.
Add External JARs...

瀏覽選取安裝了的 android-support-v4.jar, 再按 OK.
Android Compatibility package

完成.

2011年12月8日星期四

Honeypad 教程

前文提及, 筆者剛剛參加Android開發者實驗室(Android Developer Labs), 到下午CodeLab部分, Google工程師示範如何修改應用程序以優化平板電腦, 所使用的教材大家也可在網上瀏覽: http://android-codelabs.appspot.com/resources/tutorials/honeypad/index.html

Honeypad 教程

教程逐步教導如何修改一個基於手機的記事本應用程序開始, 使其運行於手機和平板電腦. 從而理解Android 3.0框架和兼容包(compatibility package).

註: 你可能會遇到編譯錯誤, 例如:
The import android.support cannot be resolved
FragmentActivity cannot be resolved to a type

參考下文: 添加Android的兼容包 (Android Compatibility package)



2011年12月7日星期三

Android 3.2.1@HTC Flyer: 開發者實驗室 (Android Developer Labs) 2011-12-06香港.

昨天(2011-12-06)有機會參加在香港舉行的開發者實驗室 (Android Developer Labs), 這次主要集中於如何對運行Android 3的平板電腦進行優化. 多位Google工程師對參加者提供了許多很update的資料, 也示範了一些冰淇淋三明治(Ice Cream Sandwich)的新功能.

到下午CodeLab部分, Google工程師示範如何修改應用程序以優化平板電腦, 期間...意外地...示範用的電腦久久未能啟動Android Emulator, 於是Google 提供 second plan - 為每一位參加者提供一部 HTC Flyer P512, 7寸, Wifi版平板電腦...嗬嗬嗬:)

HTC Flyer@ADL

特別是: 這部HTC Flyer是運行Android 3.2.1, 但是不知是不是歐洲版, 它沒有提供中日韓等語言選項. Anyway, thanks Google!

HTC Flyer running Android 3.2.1

2011年11月26日星期六

通過 Intent 啟動谷歌地圖 Google Maps App



        final String zoom = "12";
final double lat = 22.278333;
final double lon = 114.158889;
String startmaps = "geo:" + lat + "," + lon + "?z=" + zoom;

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(startmaps));
startActivity(intent);


通過 Intent 啟動谷歌地圖 Google Maps App

2011年11月12日星期六

參加 Galaxy Nexus Challenge 比賽, 贏Galaxy Nexus

Google Nexus Twitter (twitter.com/googlenexu) 現平舉辦 Galaxy Nexus Challenge 比賽, 送出運行最新 Android 4.0 ICS 的 Galaxy Nexus. 以下國家/地區的合法居民可以參加: 在澳大利亞,加拿大,法國,德國,香港,日本,荷蘭,新加坡,西班牙,韓國,英國或美國的50個州和哥倫比亞.

詳細比賽規則: http://www.google.com/nexus/challenge3/rules.pdf

睇到我一頭霧水!都唔知點玩。



2011年11月9日星期三

亞洲區 Android 開發者實驗室 (Android Developer Labs) - 十二月, 台北/香港.

Android 開發者實驗室 (Android Developer Labs) 將在十二月在台北和香港舉辦.
  • 台北 — 2011年12月2日
  • 香港 — 2011年12月6日


這次ADL系列並不是 Android 開發的入門介紹。它是專門針對如何對應 Android 平板電腦(Tablet)優化應用程序。

詳情: Android Developers Blog - More Android Developer Labs in Asia

2011年10月19日星期三

Galaxy Nexus/Android 4.0 發佈會全記錄


谷歌/三星推出 Android 4.0 冰淇淋三明治 - 2011年10月19日,香港



2011年10月15日星期六

指定 Drawable 設定為列表視圖(ListView)的背景

指定 Drawable 設定為列表視圖(ListView)的背景
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/icon"
android:cacheColorHint="#00000000" />


相關文章:
- 設定列表視圖(ListView)的背景顏色

設定列表視圖(ListView)的背景顏色

在佈局文件的 XML 中, 可通過列表視圖(ListView)的 android:background 和 android:cacheColorHint 以設定列表視圖的背景顏色.

設定列表視圖(ListView)的背景顏色

<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#FF500000"
android:cacheColorHint="#00000000" />



相關文章:
- 指定 Drawable 設定為列表視圖(ListView)的背景



2011年10月14日星期五

2011年10月19日香港: Google + Samsung 正式公佈雪糕三明治(Ice Cream Sandwich)

Android 的官方YouTube頻道(http://www.youtube.com/android)已更新顯示:
10/19/2011 - 10 AM Hong Kong Time (HKT)

2011年10月19日香港: Google + Samsung 正式公佈雪糕三明治(Ice Cream Sandwich)

Live: YouTube.com/Android, 10/19/11, 10AM, Hong Kong Time (HKT)



Android谷歌翻譯(Google Translate)的對話模式(Conversation Mode)現支持更多語言, 包括中文.

除了原有的英語和西班牙語,Android谷歌翻譯(Google Translate)的對話模式(Conversation Mode)現在也支持巴西葡萄牙語,捷克語,荷蘭語,法語,德語,意大利語,日語,韓語,中文普通話,波蘭,俄羅斯和土耳其。

詳情: http://googlemobile.blogspot.com/2011/10/start-conversation-with-google.html



Android Market的下載鏈接

讀取多選項列表視圖(Read multiple choice ListView)

讀取多選項列表視圖(Read multiple choice ListView)

package com.MultiChoiceList;

import android.app.Activity;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MultiChoiceList extends Activity {

ListView list;
TextView selection;

String[] options = {"Option 1", "Option 2", "Option 3",
"Option 4", "Option 5", "Option 6"};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
list = (ListView)findViewById(R.id.list);
selection = (TextView)findViewById(R.id.selection);

ArrayAdapter<String> adapter
= new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice,
options);
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

list.setAdapter(adapter);

list.setOnItemClickListener(new OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
selection.setText(ReadSelection());
}});
}

String ReadSelection(){

String selected = "";
int cntChoice = list.getCount();
SparseBooleanArray sparseBooleanArray = list.getCheckedItemPositions();

for(int i = 0; i < cntChoice; i++){
if(sparseBooleanArray.get(i)) {
selected += list.getItemAtPosition(i).toString() + "\n";
}
}

return selected;
}
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<TextView
android:id="@+id/selection"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>




2011年10月13日星期四

含多項選擇(multiple choice)的列表視圖(ListView)

通過 setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) 以及 android.R.layout.simple_list_item_multiple_choice 佈局, 可以設定列表視圖(ListView)為多選項.

實例:

含多項選擇(multiple choice)的列表視圖(ListView)

package com.MultiChoiceList;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MultiChoiceList extends Activity {

ListView list;

String[] options = {"Option 1", "Option 2", "Option 3",
"Option 4", "Option 5", "Option 6"};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
list = (ListView)findViewById(R.id.list);

ArrayAdapter<String> adapter
= new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice,
options);
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

list.setAdapter(adapter);
}
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>



相關文章:
- 讀取多選項列表視圖(Read multiple choice ListView)



2011年10月12日星期三

2011年10月2日星期日

從 SD Card 中讀取圖像檔案

從 SD Card 中讀取圖像檔案

package com.AndroidLoadFromSD;

import java.io.File;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class AndroidLoadFromSD extends Activity {

ImageView Image;
Button LoadButton;
Bitmap bmImage;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Image = (ImageView)findViewById(R.id.image);
LoadButton = (Button)findViewById(R.id.load);

LoadButton.setOnClickListener(new Button.OnClickListener(){

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

String extStorage = Environment.getExternalStorageDirectory().toString();
String file = new File(extStorage, "myFile.PNG").toString();
Bitmap bm = BitmapFactory.decodeFile(file);
Image.setImageBitmap(bm);

Toast.makeText(AndroidLoadFromSD.this,
extStorage+"/myFile.PNG",
Toast.LENGTH_LONG).show();

}});
}
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/load"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Load Image (myFile.PNG)"
/>
<ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>


相關文章:
- 儲存圖像到 SD Card 中



2011年10月1日星期六

儲存圖像到 SD Card 中

儲存圖像到 SD Card 中

package com.AndroidSaveOnSD;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class AndroidSaveOnSD extends Activity {

ImageView Image;
Button SaveButton;
Bitmap bmImage;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Image = (ImageView)findViewById(R.id.image);
SaveButton = (Button)findViewById(R.id.save);

bmImage = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
Image.setImageBitmap(bmImage);

SaveButton.setOnClickListener(new Button.OnClickListener(){

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

String extStorage = Environment.getExternalStorageDirectory().toString();
File file = new File(extStorage, "myFile.PNG");

try {
OutputStream outStream = new FileOutputStream(file);
bmImage.compress(Bitmap.CompressFormat.PNG, 100, outStream);
outStream.flush();
outStream.close();
Toast.makeText(AndroidSaveOnSD.this,
extStorage+"/myFile.PNG",
Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(AndroidSaveOnSD.this,
e.toString(),
Toast.LENGTH_LONG).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(AndroidSaveOnSD.this,
e.toString(),
Toast.LENGTH_LONG).show();
}

}});
}
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/save"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Save Image (myFile.PNG)"
/>
</LinearLayout>


注意須修改 AndroidManifest.xml 添加 "android.permission.WRITE_EXTERNAL_STORAGE" 權限.

相關文章:
- 從 SD Card 中讀取圖像檔案





2011年9月23日星期五

接近傳感器 (Proximity Sensor)

通過接近傳感器 (Proximity Sensor)可以檢測到 Android 手機靠近我的臉, 進而做一些動作, 例如禁用觸摸功能,或關閉屏幕.

public class AndroidProximitySensorActivity extends Activity {
/** Called when the activity is first created. */

SensorManager mySensorManager;
Sensor myProximitySensor;

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

mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
myProximitySensor = mySensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

if (myProximitySensor == null){
//No Proximity Sensor!

}else{
mySensorManager.registerListener(proximitySensorEventListener, myProximitySensor,SensorManager.SENSOR_DELAY_NORMAL);
}
}

SensorEventListener proximitySensorEventListener = new SensorEventListener(){

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub

}

@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub

if(event.sensor.getType()==Sensor.TYPE_PROXIMITY){
//do something
}
}
};
}



2011年9月19日星期一

顯示標題進度條, setProgressBarIndeterminateVisibility()

要在標題欄顯示進度條, 首先在 setContentView() 前調用 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS) 函數要求FEATURE_INDETERMINATE_PROGRESS 功能. 再通過調用 setProgressBarIndeterminateVisibility(true/false) 函數顯示/隱藏標題進度條.

顯示標題進度條

package com.AndroidProgressTitle;

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

public class AndroidProgressTitleActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);

Button showProgress = (Button)findViewById(R.id.showprogress);
Button hideProgress = (Button)findViewById(R.id.hideprogress);

showProgress.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
setProgressBarIndeterminateVisibility(true);
}});

hideProgress.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
setProgressBarIndeterminateVisibility(false);
}});
}
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/showprogress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="顯示標題進度條"
/>
<Button
android:id="@+id/hideprogress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="隱藏標題進度條"
/>
</LinearLayout>

2011年9月10日星期六

通過 XML 在文本視圖 (TextView) 設定陰影效果 (shadow)

在文本視圖 (TextView) 設定陰影效果


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:shadowColor="#FFFFFF"
android:shadowRadius="5"
android:shadowDx="10"
android:shadowDy="10"
/>
</LinearLayout>




2011年9月6日星期二

android:onClick - 定義 onClick 事件回調函數

我們可以在佈局文件(main.xml)中通過 android:onClick 屬性, 直接定義 onClick 事件的回調函數.

實例:

<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Click Me"
android:onClick="onClick"
/>
</LinearLayout>




package com.AndroidOnClick;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class AndroidOnClickActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

public void onClick(View view){
Toast.makeText(AndroidOnClickActivity.this,
"Button Clicked", Toast.LENGTH_LONG).show();
}
}



2011年8月26日星期五

一個容易讀取手機聯繫人的方法, Activity.managedQuery()

本例子通過調用 Activity.managedQuery() 方法讀取手機聯繫人.

一個容易讀取手機聯繫人的方法, Activity.managedQuery()

package com.AndroidContacts;


import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.widget.SimpleCursorAdapter;

public class AndroidContactsActivity extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

String[] projection = {People._ID, People.NAME};
Cursor cursor = managedQuery(
People.CONTENT_URI, //Uri
projection, //projection
null, //selection
null, //selection arguments
People.NAME); //Sort by

String[] name = new String[] {People.NAME};
int[] text1 = new int[] {android.R.id.text1};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
cursor,
name,
text1);

setListAdapter(adapter);
}
}


最後, 需要修改 AndroidManifest.xml 文件, 添加 "android.permission.READ_CONTACTS" 權限


2011年8月24日星期三

Android SDK 的谷歌電視附加功能預覽


隨著即將到來的 Android 操作系統升級到蜂窩,谷歌電視將兼容 Android。這意味著開發人員可以優化現有的移動手機或平板電腦,創建對應谷歌電視的 Android App,並通過 Android市場分發這些應用程序。

詳情:
- Preview of Google TV Add-on for the Android SDK

2011年8月18日星期四

實施廣播接收器(BroadcastReceiver)檢測USB大容量存儲模式(USB Mass Storage mode)

檢測USB大容量存儲(USB Mass Storage)的連接(Connected)和斷開(Disconnected)模式之間的轉換, 我們可以擴展廣播接收器(BroadcastReceiver), 處理 Intent.ACTION_UMS_CONNECTED 和 Intent.ACTION_UMS_DISCONNECTED 事件. 此事件會在通過 USB 連接和斷開時發生.

實施廣播接收器(BroadcastReceiver)檢測USB大容量存儲模式(USB Mass Storage mode)

實例:
package com.AndroidUSB;


import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.TextView;

public class AndroidUSBActivity extends Activity {

TextView umsState;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
umsState = (TextView)findViewById(R.id.ums_state);

registerReceiver(receiverUmsConnected, new IntentFilter(Intent.ACTION_UMS_CONNECTED));
registerReceiver(receiverUmsDisConnected, new IntentFilter(Intent.ACTION_UMS_DISCONNECTED));

}

BroadcastReceiver receiverUmsConnected
= new BroadcastReceiver(){

@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
umsState.setText("USB Mass Storage Connected");
}};

BroadcastReceiver receiverUmsDisConnected
= new BroadcastReceiver(){

@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
umsState.setText("USB Mass Storage Disconnected");

}};
}





2011年8月14日星期日

更改應用程序的標題(Title)

更改應用程序的標題, 我們可以使用Java代碼調用 setTitle() 函數.

例如:

	setTitle("Test");



更改應用程序的標題(Title)

2011年8月4日星期四

通過意圖(Intent)啟動其他應用程序共享文本

有時我們希望與別人分享一些東西, 我們可以通過 Intent.ACTION_SEND 意圖(Intent), 設置類型"text/plain", 啟動其他共享應用程序, 例如 email, SMS...

實例:

通過意圖(Intent)啟動其他應用程序共享文本

package com.AndroidShareText;

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

public class AndroidShareTextActivity extends Activity {

EditText TextInput;
Button buttonShare;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

TextInput = (EditText)findViewById(R.id.input);
buttonShare = (Button)findViewById(R.id.share);

buttonShare.setOnClickListener(new Button.OnClickListener(){

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

String textToBeSent = TextInput.getText().toString();

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, textToBeSent);
startActivity(Intent.createChooser(intent, "Share..."));
}});

}
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<EditText
android:id="@+id/input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/share"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Share"
/>
</LinearLayout>

2011年8月3日星期三

通過Java 碼在編輯文本(EditText)旁邊放置圖標, setCompoundDrawablesWithIntrinsicBounds

通過 setCompoundDrawablesWithIntrinsicBounds() 方法可在編輯文本(EditText)旁邊放置圖標.

實例:
通過 Java 碼在編輯文本(EditText)旁邊放置圖標

package com.AndroidEditText;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class AndroidEditTextActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final EditText input = (EditText)findViewById(R.id.input);
Button buttonClear = (Button)findViewById(R.id.clear);
buttonClear.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
input.setText("");
}});

Drawable icon = getResources().getDrawable(R.drawable.icon);

input.setCompoundDrawablesWithIntrinsicBounds(
icon, //left
icon, //top
icon, //right
icon); //bottom

}
}



相關文章:
- 通過XML在編輯文本(EditText)旁邊放置圖標

通過XML在編輯文本(EditText)旁邊放置圖標

在佈局文件(mian.xml)中, 使用android:drawableLeft, drawableTop, drawableRight 和 drawableLeft 可在編輯文本(EditText)旁邊放置圖標.

實例:

通過XML在編輯文本(EditText)旁邊放置圖標

<EditText  
android:id="@+id/input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="請輸入"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/clear"
android:drawableRight="@drawable/icon"/>



相關文章:
- 通過Java 碼在編輯文本(EditText)旁邊放置圖標, setCompoundDrawablesWithIntrinsicBounds

2011年7月31日星期日

實現編輯文字(EditText)的清除按鈕

實例:
實現編輯文字(EditText)的清除按鈕

package com.AndroidEditText;

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

public class AndroidEditTextActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final EditText input = (EditText)findViewById(R.id.input);
Button buttonClear = (Button)findViewById(R.id.clear);
buttonClear.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
input.setText("");
}});

}
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="CLEAR"
android:layout_alignParentRight="true"/>
<EditText
android:id="@+id/input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="請輸入"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/clear"/>

</RelativeLayout>
</LinearLayout>


2011年7月30日星期六

顯示編輯文字的提示字

可使用 android:hint 標記設置顯示編輯文字的提示字.

實例:

顯示編輯文字的提示字

<EditText  
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="請輸入" />


2011年7月24日星期日

通過 Java 代碼設定 layout_width 為 50%

參考前文"怎麼設定layout_width為50%", 我們可以設置 <Button> 的重量參數(weight)設定 layout_width 為 50%.

但當我們使用 Java 代碼, 如果定義按鈕的 LayoutParams 為 LayoutParams, 我們是不能設置重量參數(weight)的!

可以把按鈕的 LayoutParams 定義為 LinearLayout.LayoutParams, 便可以通過 new LinearLayout.LayoutParams() 或 LinearLayout.LayoutParams.weight 設置重量參數(weight).

通過 Java 代碼設定 layout_width 為 50%

package com.AndroidWeight;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;

public class AndroidWeightActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

LinearLayout layout = new LinearLayout(getApplicationContext());
layout.setOrientation(LinearLayout.HORIZONTAL);

// Half Button 1
LinearLayout subLayout1 = new LinearLayout(getApplicationContext());
LinearLayout.LayoutParams paramsSubLayout1
= new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1.0f);
subLayout1.setLayoutParams(paramsSubLayout1);
subLayout1.setOrientation(LinearLayout.VERTICAL);

Button buttonHalfWidth1 = new Button(getApplicationContext());
buttonHalfWidth1.setText("Half Width 1");
LayoutParams paramsHalfWidth1
= new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
buttonHalfWidth1.setLayoutParams(paramsHalfWidth1);

// Half Button 2
Button buttonHalfWidth2 = new Button(getApplicationContext());
buttonHalfWidth2.setText("Half Width 2");
LinearLayout.LayoutParams paramsHalfWidth2
= new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
paramsHalfWidth2.weight = 1.0f;
buttonHalfWidth2.setLayoutParams(paramsHalfWidth2);

//--------
subLayout1.addView(buttonHalfWidth1);
layout.addView(subLayout1);
layout.addView(buttonHalfWidth2);

setContentView(layout);
}
}

2011年7月23日星期六

在標題欄顯示圖標(icon) - Window.FEATURE_LEFT_ICON/Window.FEATURE_RIGHT_ICON

要在標題欄顯示圖標, 先要要求窗口功能 Window.FEATURE_LEFT_ICON 和/或 Window.FEATURE_RIGHT_ICON:
requestWindowFeature(Window.FEATURE_LEFT_ICON);
requestWindowFeature(Window.FEATURE_RIGHT_ICON);

再調用 setFeatureDrawableResource() 方法來設定它.

實例:

Window.FEATURE_LEFT_ICON/Window.FEATURE_RIGHT_ICON

package com.AndroidTitleIcon;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class AndroidTitleIconActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_LEFT_ICON);
requestWindowFeature(Window.FEATURE_RIGHT_ICON);
setContentView(R.layout.main);
getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,R.drawable.icon);
getWindow().setFeatureDrawableResource(Window.FEATURE_RIGHT_ICON,R.drawable.icon);
}
}


2011年7月22日星期五

在標題欄顯示進度圖標 - Window.FEATURE_INDETERMINATE_PROGRESS

要在標題欄顯示進度圖標, 先要要求窗口功能"Window.FEATURE_INDETERMINATE_PROGRESS":
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

再調用 setProgressBarIndeterminateVisibility(true/false) 方法來顯示/隱藏它.

實例:
在標題欄顯示進度圖標 - Window.FEATURE_INDETERMINATE_PROGRESS

package com.AndroidProgressTitleBar;

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

public class AndroidProgressTitleBarActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);

Button btnTurnOnProgress = (Button)findViewById(R.id.progresson);
Button btnTurnOffProgress = (Button)findViewById(R.id.progressoff);

btnTurnOnProgress.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
setProgressBarIndeterminateVisibility(true);
}});

btnTurnOffProgress.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
setProgressBarIndeterminateVisibility(false);
}});
}
}


2011年7月21日星期四

利用程式碼更改文字顏色, setTextColor()

實例:

利用程式碼更改文字顏色, setTextColor()

package com.AndroidText;

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

public class AndroidTextActivity extends Activity {

TextView text;
Button buttonChangeTextColor;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView)findViewById(R.id.text);
buttonChangeTextColor = (Button)findViewById(R.id.changetextcolor);

buttonChangeTextColor.setOnClickListener(new Button.OnClickListener(){

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

/*
* setTextColor(
* ((alpha << 24) & 0xFF000000)
* + ((red << 16) & 0x00FF0000)
* + ((green << 8) & 0x0000FF00)
* + (blue & 0x000000FF));
*/


//setTypeface for TextView
text.setTextColor(0xFF008080);
//setTypeface for Button
buttonChangeTextColor.setTextColor(0xFFFF0000);
}});
}
}


<?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"
>
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/changetextcolor"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Text Color"
/>
</LinearLayout>


2011年7月20日星期三

動態改變文字的字體, setTypeface(typeface, style)

我們可以使用 Java 碼, 調用 setTypeface() 方法, 改變文字的字體.

textview.setTypeface(typeface, style)

其中 typeface 參數可以是:
- Typeface.DEFAULT
- Typeface.DEFAULT_BOLD
- Typeface.MONOSPACE
- Typeface.SANS_SERIF
- Typeface.SERIF

style 參數可以是:
- Typeface.BOLD
- Typeface.BOLD_ITALIC
- Typeface.ITALIC
- Typeface.NORMAL

實例:

動態改變文字的字體, setTypeface(typeface, style)

package com.AndroidText;

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

public class AndroidTextActivity extends Activity {

TextView text;
Button buttonChangeTypeFace;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView)findViewById(R.id.text);
buttonChangeTypeFace = (Button)findViewById(R.id.changetypeface);

buttonChangeTypeFace.setOnClickListener(new Button.OnClickListener(){

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

/*
* setTypeface(typeface, style)
* typeface:
* - Typeface.DEFAULT
* - Typeface.DEFAULT_BOLD
* - Typeface.MONOSPACE
* - Typeface.SANS_SERIF
* - Typeface.SERIF
*
* style:
* - Typeface.BOLD
* - Typeface.BOLD_ITALIC
* - Typeface.ITALIC
* - Typeface.NORMAL
*/


//setTypeface for TextView
text.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
//setTypeface for Button
buttonChangeTypeFace.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD_ITALIC);
}});
}
}


<?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"
>
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/changetypeface"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Typeface"
/>
</LinearLayout>


2011年7月19日星期二

動態改變文字的大小, setTextSize()

實例:

動態改變文字的大小, setTextSize()

package com.AndroidText;

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

public class AndroidTextActivity extends Activity {

TextView text;
Button buttonChangeTextSize;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView)findViewById(R.id.text);
buttonChangeTextSize = (Button)findViewById(R.id.changetextsize);

buttonChangeTextSize.setOnClickListener(new Button.OnClickListener(){

public void onClick(View arg0) {
// TODO Auto-generated method stub
//Change Text Size of TextView
text.setTextSize(50);
//Change Text Size of Button
buttonChangeTextSize.setTextSize(35);
}});
}
}


<?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"
>
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/changetextsize"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change Text Size"
/>
</LinearLayout>


使用 Java 代碼動態改變按鈕的大小

我們可以使用 Java 碼, 通過改變佈局參數(LayoutParams)來改變按鈕的大小.

實例:

按鈕原來的大小
動態改變後的按鈕大小

package com.AndroidButtonSize;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;

public class AndroidButtonSizeActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new Button.OnClickListener(){

public void onClick(View v) {
// TODO Auto-generated method stub
LayoutParams params = button.getLayoutParams();
params.width = 300;
params.height = 200;
button.setLayoutParams(params);
}});
}
}


2011年7月16日星期六

谷歌發佈 Android 3.2 SDK 工具

谷歌剛剛發佈新的 Android 3.2 SDK 工具, 為用戶和開發人員添加了一些新功能. 新平台 API Level 13 包括一些API的變化。
  • 更廣泛的平板電腦優化
  • 固定大小應用程序的 zoom 的兼容性
  • SD 卡的媒體同步
  • 支持擴展屏幕的API


谷歌還同時更新了 SDK Tools (r12), Eclipse 插件 (ADT 12) 以及 NDK (r6).

詳情:
http://android-developers.blogspot.com/2011/07/android-32-platform-and-updated-sdk.html

2011年7月15日星期五

通過EXTRA_OUTPUT, 指定並顯示使用 ACTION_IMAGE_CAPTURE 拍攝的圖像

在本博客的舊文章"通過EXTRA_OUTPUT, 指定儲存圖像的路徑"中, 描述了如何指定儲存圖像的路徑, 但沒有描述如何顯示拍攝的圖像. 本文將描述如何在onActivityResult()通過 BitmapFactory 顯示拍攝的圖像.

通過EXTRA_OUTPUT, 指定並顯示使用 ACTION_IMAGE_CAPTURE 拍攝的圖像

package com.AndroidImageCapture;

import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class AndroidImageCaptureActivity extends Activity {

ImageView imageiewImageCaptured;
String strImage;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button buttonImageCapture = (Button)findViewById(R.id.captureimage);
imageiewImageCaptured = (ImageView)findViewById(R.id.imagecaptured);

buttonImageCapture.setOnClickListener(buttonImageCaptureOnClickListener);
}

Button.OnClickListener buttonImageCaptureOnClickListener
= new Button.OnClickListener(){

public void onClick(View v) {
// TODO Auto-generated method stub
//Specify the path of the captured image
strImage = Environment.getExternalStorageDirectory().getAbsolutePath()+"/mypicture.jpg";
File myImage = new File(strImage);
Uri uriMyImage = Uri.fromFile(myImage);

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uriMyImage);
startActivityForResult(intent, 0);
}
};

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
Bitmap bmp = BitmapFactory.decodeFile(strImage);
imageiewImageCaptured.setImageBitmap(bmp);
}
}
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/captureimage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Call for ACTION_IMAGE_CAPTURE"
/>
<ImageView
android:id="@+id/imagecaptured"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>


2011年7月13日星期三

如何鎖定屏幕方向, setRequestedOrientation

我們可以調用 getResources().getConfiguration().orientation 獲得當前的屏幕方向, 然後調用 setRequestedOrientation() 方法鎖定屏幕方向.

例子:

鎖定屏幕方向

package com.AndroidFixOrientation;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;

public class AndroidFixOrientationActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

CheckBox fixOrientation = (CheckBox)findViewById(R.id.FixOrientation);

fixOrientation.setOnCheckedChangeListener(new OnCheckedChangeListener(){

int currentOrientation = getResources().getConfiguration().orientation;

public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
if(arg1){
switch(currentOrientation) {
case Configuration.ORIENTATION_LANDSCAPE:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case Configuration.ORIENTATION_PORTRAIT:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
default:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}else{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}});


}
}


2011年7月5日星期二

檢索字符串資源, getString()

有時,我們將定義我們的字符串形式的資源

我們會使用資源(resources)的方式定義我們的字符串; 例如 /res/values/strings.xml 中的 "app_name".

如果我們要檢索這樣的字符串資源, 不能直接使用 myAppName = R.string.app_name, 我們要通過 getString() 方法檢索字符串資源.

例子:

檢索字符串資源, getString()

package com.StringResource;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class StringResourceActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

TextView text1 = (TextView)findViewById(R.id.text1);
TextView text2 = (TextView)findViewById(R.id.text2);

text1.setText(R.string.app_name);

String myAppName;
//myAppName = R.string.app_name; //Error!
myAppName = getString(R.string.app_name);
text2.setText(myAppName);
}
}


2011年6月21日星期二

子菜單(SubMenu)

使用子菜單(SubMenu)的工作示例:

子菜單(SubMenu)

package com.AndroidMenu;

import android.app.Activity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;

public class AndroidMenuActivity extends Activity {

final static int OPTION_ID_1 = 1;
final static int OPTION_ID_2 = 2;
final static int OPTION_ID_3 = 3;
final static int OPTION_ID_4 = 4;
final static int OPTION_ID_5 = 5;

final static int OPTION_ID_6 = 6;
final static int OPTION_ID_6_1 = 61;
final static int OPTION_ID_6_2 = 62;
final static int OPTION_ID_6_3 = 63;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu);

//menu.add(Group, item id, order, title);
menu.add(0, OPTION_ID_1, 0, "Option 1");
menu.add(0, OPTION_ID_2, 1, "Option 2");
menu.add(0, OPTION_ID_3, 2, "Option 3");
menu.add(0, OPTION_ID_4, 3, "Option 4");
menu.add(0, OPTION_ID_5, 4, "Option 5");

SubMenu subMenu6 = menu.addSubMenu(0, OPTION_ID_5, 5, "SubMenu");
subMenu6.add(0, OPTION_ID_6_1, 0, "SubMenu6.1");
subMenu6.add(0, OPTION_ID_6_2, 0, "SubMenu6.2");
subMenu6.add(0, OPTION_ID_6_3, 0, "SubMenu6.3");

return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub

switch(item.getItemId()){
case OPTION_ID_1:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;
case OPTION_ID_2:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;
case OPTION_ID_3:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;
case OPTION_ID_4:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;
case OPTION_ID_5:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;
default:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;

}

return true;
}


}



相關文章:
- 選項菜單(OptionsMenu)

2011年6月20日星期一

選項菜單(OptionsMenu)

當用戶按 MENU 硬件按鈕, Android 系統會顯示選項菜單(OptionsMenu)

選項菜單(OptionsMenu)

應用程序可以重寫 onCreateOptionsMenu(Menu menu) 方法創建選項菜單(OptionsMenu), 並重寫 onOptionsItemSelected(MenuItem item) 方法處理事件.

範例:
package com.AndroidMenu;

import android.app.Activity;

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

public class AndroidMenuActivity extends Activity {

final static int OPTION_ID_1 = 1;
final static int OPTION_ID_2 = 2;
final static int OPTION_ID_3 = 3;
final static int OPTION_ID_4 = 4;
final static int OPTION_ID_5 = 5;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu);

//menu.add(Group, item id, order, title);
menu.add(0, OPTION_ID_1, 0, "Option 1");
menu.add(0, OPTION_ID_2, 1, "Option 2");
menu.add(0, OPTION_ID_3, 2, "Option 3");
menu.add(0, OPTION_ID_4, 3, "Option 4");
menu.add(0, OPTION_ID_5, 4, "Option 5");

return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub

switch(item.getItemId()){
case OPTION_ID_1:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;
case OPTION_ID_2:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;
case OPTION_ID_3:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;
case OPTION_ID_4:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;
case OPTION_ID_5:
Toast.makeText(AndroidMenuActivity.this,
item.getTitle(),
Toast.LENGTH_LONG).show();
break;

}

return true;
}
}



相關文章:
- 子菜單(SubMenu)

如何設置應用程序的背景為透明

可以修改清單文件, AndroidManifest.xml, 在 <activity> 裡面添加代碼 android:theme="@android:style/Theme.Translucent".

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.AndroidTranslucent"
    android:versionCode="1"
    android:versionName="1.0">
  <uses-sdk android:minSdkVersion="4" />
 
  <application android:icon="@drawable/icon" android:label="@string/app_name">
      <activity android:name=".AndroidTranslucent"
                android:label="@string/app_name"
                android:theme="@android:style/Theme.Translucent">
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>
 
  </application>
</manifest>


2011年6月9日星期四

谷歌推出 Android 的手勢搜索應用程序接口(Gesture Search API)


谷歌實驗室(Google Labs)發布手勢搜索應用程序接口(Gesture Search API), 它可以讓開發人員把手勢搜索整合到應用程序,使得用戶可以手寫輸入文字和搜索。

谷歌官方Code博客(The Official Google Code Blog)有一篇文章, Add Gesture Search to your Android apps,展示我們如何能夠嵌入手勢搜索(1.4.0或更新版本)到一個 Android應用程序。

2011年6月8日星期三

使用意圖(Intent)啟動 Android 內建谷歌地圖的街景(StreetView)

啟動 Android 內建谷歌地圖的街景(StreetView), 可以使用:
"google.streetview:cbll=<lat>,<lon>

使用意圖(Intent)啟動 Android 內建谷歌地圖的街景(StreetView)
使用意圖(Intent)啟動 Android 內建谷歌地圖的街景(StreetView)

package com.AndroidIntentGoogleMaps;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class AndroidIntentGoogleMaps extends Activity {

EditText inputLatitude, inputLongitude;
Button buttonStartMaps;

final static float DEFAULT_Latitude = (float) 40.75773;
final static float DEFAULT_Longitude = (float) -73.985708;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

inputLatitude = (EditText)findViewById(R.id.Latitude);
inputLongitude = (EditText)findViewById(R.id.Longitude);
buttonStartMaps = (Button)findViewById(R.id.startmaps);

inputLatitude.setText(String.valueOf(DEFAULT_Latitude));
inputLongitude.setText(String.valueOf(DEFAULT_Longitude));

buttonStartMaps.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String lat = inputLatitude.getText().toString();
String lon = inputLongitude.getText().toString();

String strUri = "google.streetview:cbll="+lat+","+lon;

Toast.makeText(AndroidIntentGoogleMaps.this, strUri, Toast.LENGTH_LONG).show();

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(strUri));
startActivity(intent);
}});

}
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Latitude" />
<EditText
android:id="@+id/Latitude"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Longitude" />
<EditText
android:id="@+id/Longitude"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Zoom" />
<Button
android:id="@+id/startmaps"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start Street View" />
</LinearLayout>



相關文章:
- 使用意圖(Intent)啟動 Android 內建谷歌地圖

2011年6月7日星期二

使用意圖(Intent)啟動 Android 內建谷歌地圖

通過意圖(Intent), 應用程序可啟動 Android 內建谷歌地圖; 指定地點及縮放程度. 下面是一個例子.

使用意圖(Intent)啟動 Android 內建谷歌地圖
使用意圖(Intent)啟動 Android 內建谷歌地圖

package com.AndroidIntentGoogleMaps;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Toast;

public class AndroidIntentGoogleMaps extends Activity {

EditText inputLatitude, inputLongitude;
SeekBar seekbarZoom;
Button buttonStartMaps;

final static float DEFAULT_Latitude = (float) 40.75773;
final static float DEFAULT_Longitude = (float) -73.985708;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

inputLatitude = (EditText)findViewById(R.id.Latitude);
inputLongitude = (EditText)findViewById(R.id.Longitude);
seekbarZoom = (SeekBar)findViewById(R.id.zoom);
buttonStartMaps = (Button)findViewById(R.id.startmaps);

inputLatitude.setText(String.valueOf(DEFAULT_Latitude));
inputLongitude.setText(String.valueOf(DEFAULT_Longitude));

buttonStartMaps.setOnClickListener(new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String lat = inputLatitude.getText().toString();
String lon = inputLongitude.getText().toString();
String zoom = String.valueOf(seekbarZoom.getProgress()+1);
String strUri = "geo:"+lat+","+lon+"?z="+zoom;

Toast.makeText(AndroidIntentGoogleMaps.this, strUri, Toast.LENGTH_LONG).show();

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(strUri));
startActivity(intent);
}});

}
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Latitude" />
<EditText
android:id="@+id/Latitude"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Longitude" />
<EditText
android:id="@+id/Longitude"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Zoom" />
<SeekBar
android:id="@+id/zoom"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="22"
android:padding="10dp" />
<Button
android:id="@+id/startmaps"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start Google Maps" />
</LinearLayout>



相關文章:
- 使用意圖(Intent)啟動 Android 內建谷歌地圖的街景(StreetView)

Android 開發工具 ADT 11 已供下載,改進編輯功能

ADT 11 重點改進編輯器。
  • 首先,它提供了一些新的視覺重構操作,如"Extract Include'和"Extract Style". 這有助於自動提取片段重複佈局和樣式屬性為可重複使用的佈局,樣式和主題。
  • 第二,可視化佈局編輯器現在支持的片段,調色板配置,更好地支持自定義視圖。
  • 最後,已經改良XML編輯,更多文件類型的代碼完成(code completion)和增強許多"轉至聲明"(go to declaration)。


來源:
- Android開發者博客: New Editing Features in Eclipse plug-in for Android



2011年5月31日星期二

動態修改列表視圖(ListView)的內容

修改前文"動態刪除列表視圖(ListView)的內容"的程序代碼, 在對話框(delAlertDialog)新增修改選項, 再建立另一個包含編輯文本視圖 (EditText) 的對話框(editDialog). 完成後, 通過 MyArrayAdapter.remove() 和 MyArrayAdapter.insert() 修改列表視圖(ListView)的內容.

動態修改列表視圖(ListView)的內容

package com.AndroidDynList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class AndroidDynList extends Activity {

EditText input;
Button add, clear;
ListView listview;
ArrayAdapter<String> MyArrayAdapter;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
input = (EditText)findViewById(R.id.input);
add = (Button)findViewById(R.id.add);
clear = (Button)findViewById(R.id.clear);
listview = (ListView)findViewById(R.id.list);

MyArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
listview.setAdapter(MyArrayAdapter);

add.setOnClickListener(addOnClickListener);
clear.setOnClickListener(clearOnClickListener);

listview.setOnItemClickListener(listViewOnItemClickListener);
}

private Button.OnClickListener addOnClickListener
= new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String newInput = input.getText().toString();
MyArrayAdapter.add(newInput);
MyArrayAdapter.notifyDataSetChanged();
}};

private Button.OnClickListener clearOnClickListener
= new Button.OnClickListener(){

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
MyArrayAdapter.clear();
MyArrayAdapter.notifyDataSetChanged();
}};

private ListView.OnItemClickListener listViewOnItemClickListener
= new ListView.OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> parent, View view, final int position,
long id) {
// TODO Auto-generated method stub
final String strSelectedItem = parent.getItemAtPosition(position).toString();

AlertDialog.Builder delAlertDialog = new AlertDialog.Builder(AndroidDynList.this);
delAlertDialog.setTitle("- DELETE/Edit Selected Item? -");
delAlertDialog.setMessage(strSelectedItem);
delAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
MyArrayAdapter.remove(strSelectedItem);
MyArrayAdapter.notifyDataSetChanged();
}
});
delAlertDialog.setNeutralButton("Edit", new DialogInterface.OnClickListener() {

// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
AlertDialog.Builder editDialog = new AlertDialog.Builder(AndroidDynList.this);
editDialog.setTitle("--- Edit ---");

final EditText editText = new EditText(AndroidDynList.this);
editText.setText(strSelectedItem);
editDialog.setView(editText);

editDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
MyArrayAdapter.remove(strSelectedItem);
MyArrayAdapter.insert(editText.getText().toString(), position);
}});
editDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
//...
}
});
editDialog.show();
}
});
delAlertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
//...
}
});
delAlertDialog.show();
}};
}


2011年5月29日星期日

利用 AlertDialog.Builder 創建包含編輯文本視圖 (EditText) 的對話框

包含編輯文本視圖 (EditText) 的對話框


package com.AndroidEditDialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AndroidEditDialog extends Activity {

Button btnEdit;
TextView textOut;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnEdit = (Button)findViewById(R.id.edit);
textOut = (TextView)findViewById(R.id.textout);

btnEdit.setOnClickListener(btnEditOnClickListener);
}

private Button.OnClickListener btnEditOnClickListener
= new Button.OnClickListener(){

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

AlertDialog.Builder editDialog = new AlertDialog.Builder(AndroidEditDialog.this);
editDialog.setTitle("--- Edit ---");

final EditText editText = new EditText(AndroidEditDialog.this);
editText.setText(textOut.getText());
editDialog.setView(editText);

editDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
textOut.setText(editText.getText().toString());
}
});
editDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
// do something when the button is clicked
public void onClick(DialogInterface arg0, int arg1) {
//...
}
});
editDialog.show();

}};
}


<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Edit"
/>
<TextView
android:id="@+id/textout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="You can change it"
/>
</LinearLayout>