Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android開發教程之高煥堂-上課講義(6)

Android開發教程之高煥堂-上課講義(6)

編輯:初級開發

l 使用Intent物件

雖然透過Intent並非最快速,但卻是最有彈性的。無論是同一進程或是跨進程的溝通都可以使用它。例如:

/* ===== EX-02 ====== */

/* ac01.Java */

package com.misoo.pkzz;

import android.app.Activity;

import android.content.Intent;

import android.content.SharedPreferences;

import android.os.Bundle;

import android.view.VIEw;

import android.view.VIEw.OnClickListener;

import android.widget.Button;

import android.widget.LinearLayout;

public class ac01 extends Activity implements OnClickListener {

private Button btn, btn2, btn4;

public static ac01 appRef = null;

private final static String KKK = "AnyKey";

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

appRef = this;

setContentVIEw(R.layout.main);

this.show_layout_01();

}

void show_layout_01(){

LinearLayout layout = new LinearLayout(this);

layout.setOrIEntation(LinearLayout.VERTICAL);

btn = new Button(this);

btn.setBackgroundResource(R.drawable.water);

btn.setText("Edit");

btn.setOnClickListener(this);

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(150, 40);

param.topMargin = 5;

layout.addVIEw(btn, param);

btn2 = new Button(this);

btn2.setBackgroundResource(R.drawable.x_blue);

btn2.setText("shared data");

btn2.setOnClickListener(this);

layout.addVIEw(btn2, param);

btn4 = new Button(this);

btn4.setBackgroundResource(R.drawable.face);

btn4.setText("Exit");

btn4.setOnClickListener(this);

layout.addVIEw(btn4, param);

setContentVIEw(layout);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data)

{

SharedPreferences passwdfile = getSharedPreferences(

"ITEM", 0);

String im = passwdfile.getString("ITEM", null);

setTitle(im);

}

public void onClick(VIEw v){

if (v == btn){

Intent intent = new Intent(Intent.ACTION_VIEW, null);

intent.putExtra(com.misoo.pkzz.ac01.KKK, "Ax004::Intent Extra Msg.");

this.startActivityForResult(intent, 0);

}

if(v.equals(btn2)){

SharedPreferences passwdfile = getSharedPreferences(

"ITEM", 0);

String im = passwdfile.getString("ITEM", null);

setTitle(im);

}

if(v.equals(btn4))

this.finish();

}

}

/* Activity_1.Java */

package com.misoo.pkzz;

import android.app.Activity;

import android.content.SharedPreferences.Editor;

import android.os.Bundle;

import android.view.VIEw;

import android.view.VIEw.OnClickListener;

import android.widget.Button;

import android.widget.LinearLayout;

public class Activity_1 extends Activity implements OnClickListener {

private Button btn;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

LinearLayout layout = new LinearLayout(this);

layout.setOrIEntation(LinearLayout.VERTICAL);

btn = new Button(this);

btn.setBackgroundResource(R.drawable.x_yellow);

btn.setText("Edit");

btn.setOnClickListener(this);

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(150, 40);

param.topMargin = 5;

layout.addVIEw(btn, param);

setContentVIEw(layout);

//-----------------------------------

String ss = this.getIntent().getStringExtra("AnyKey");

//-----------------------------------

Editor passwdfile = getSharedPreferences("ITEM", 0).edit();

passwdfile.putString("ITEM",ss);

passwdfile.commit();

}

public void onClick(VIEw arg0) {

finish();

}

}

/* AndriodManifest.XML */

 

package="com.misoo.pkzz"

android:versionCode="1"

android:versionName="1.0.0">

 

android:label="@string/app_name">

 

 

 

 

 

 


這ac01透過Intent傳遞資料給Activity_1,而Activity_1則將之存入SharePreferences裡,再回傳給ac01類別。

<< 摘錄結語 >>

上述談到的情境是:

l 其ac01與Activity_1屬於同一個Package。

l 其ac01與Activity_1 在同一個進程裡執行,或者,各再獨立的進程裡執行。

然而,如果ac01與Activity_1分別屬於不同的Package時,又如何呢?此時,就不能藉由SharePreferences來傳遞資料了,因為SharePreferences是屬於某Package內的。至於IPC的詳細溝通法,由另外的文章說明之。

==== END ====

講義摘錄之15: 從應用框架角度看ListVIEw與Adapter類別
在android應用框架(Application Framework, 簡稱AF)裡已經設計了許多類別,其中的

三個類別如下:

clip_image045

圖1 AF裡的類別

這用來協助Activity在UI畫面上顯示一個List視窗,例如:

clip_image046

圖2 應用程式(1) 圖3 應用程式(2)

請你注意AF的特性:Activity、ListVIEw和BaseAdapter兩個類別已經由Android AF開發者設計在先。只是當時android AF開發者並不知道應用程式(Applications, 簡稱AP)裡的List視窗的內容,所以預留了空間給AP程式師去補充,如下:

clip_image047

圖4 應用程式師的工作

AF設計師與AP程式師兩者在不同的時間及空間(即地點)合作。AF設計師在設計AF當時並不知道AP的List視窗裡各選項的長相(文字或是圖像等),因為這長相的決定是來自於AP的用戶。所以只有AP程式師知道,AF設計師並不知道。於是,AF設計師負責撰寫AF裡的Super-class(如BaseAdapter)而AP程式師負責撰寫AP裡的Subclass(如myStringAdapter)。兩者跨時間和空間的智慧會合而成為一支完整好用的應用程式。例如,AP程式師知道他的UI將顯示出單純的文字型List視窗,所以就撰寫myStringAdapter子類別。

當應用程式執行時,AF掌握整個控制權,呼叫ac01的onCreate()函數,詢問AP程式師的見解:

clip_image048

圖5 AF向AP詢問

在ac01的onCreate()函數裡,AP程式師回答:由myStringAdapter子類別來提供內容及長相給ListView。於是,Activity要求顯示ListView的內容時,ListView就從BaseAdapter而反向呼叫到myStringAdapter的getVIEw()等函數,而取得顯示的內容和長相了。

clip_image049

圖6 AF 依據AP的回應而具有完整的執行路線

於此,請看一個簡單的android程式碼,來體會上述智慧會合的實現。此程式的畫面顯示一個單純的文字List視窗:

clip_image050

其程式碼如下:

/* ac01.Java */

package xom.misoo.pkzz;

import android.app.Activity;

import android.os.Bundle;

import android.view.VIEw;

import android.widget.AdapterVIEw;

import android.widget.ListVIEw;

import android.widget.TextVIEw;

import android.widget.AdapterVIEw.OnItemClickListener;

public class ac01 extends Activity implements OnItemClickListener {

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentVIEw(R.layout.main);

ListView lv = new ListVIEw(this);

lv.setAdapter(new myAdapter(this));

lv.setOnItemClickListener(this);

setContentVIEw(lv);

}

public void onItemClick(AdapterView arg0, VIEw arg1, int arg2, long arg3) {

if(arg2 == 0)

setTitle(((TextVIEw)arg1).getText());

else if(arg2 == 1)

finish();

}

}

/* myAdapter.Java */

package xom.misoo.pkzz;

import Java.util.ArrayList;

import android.content.Context;

import android.graphics.Color;

import android.view.VIEw;

import android.view.VIEwGroup;

import android.widget.BaseAdapter;

import android.widget.TextVIEw;

public class myAdapter extends BaseAdapter {

private Context ctx;

private ArrayList coll;

public myAdapter(Context context) {

ctx = context;

coll = new ArrayList();

coll.add("Hello!!");

coll.add("Exit");

}

public int getCount() {

return coll.size();

}

public Object getItem(int position) {

return coll.get(position);

}

public long getItemId(int position) {

return position;

}

public View getView(int position, View convertView, VIEwGroup parent) {

TextVIEw tv;

if (convertVIEw == null)

tv = new TextVIEw(ctx);

else

tv = (TextView)convertVIEw;

tv.setTextColor(Color.CYAN);

tv.setHeight(45);

tv.setTextSize(26);

tv.setText(coll.get(position));

return tv;

}

}

其於,這樣的基本結構,就能進一步發展出各式各樣的Adapter了。例如ArrayAdapter、SimpleAdapter等等。於此,只節錄講義的前段基礎部份,至於後段的應用部分,就省略之。

講義摘錄之16: 善於設計自己的Listener來進行溝通
一、 你所熟悉的Listener

兩個Activity之間,或者Activity與Service之間,如果它們是在同一個進程(Process)裡,則設計Listener來進行溝通是個好方法。就像Activity與Button之間,也常常使用指令:

public class myActivity extends Activity {

public void onCreate(Bundle icicle) {

………….

Button btn1 = new Button(this);

…………

btn1.setOnClickListener(listener);

}

OnClickListener listener = new OnClickListener() {

………

};

}

這個Listener可以讓Button能將資料傳給Activity。

同樣地,我們也可以將這個技巧,應用於兩個Activity之間,或者Activity與Service之間的溝通。

二、範例程式:兩個Activity間之溝通
先執行ac01:

clip_image051

按下,就執行EventActivity:

clip_image052

輸入資料如:Happy NewYeara!!,並按下,返回到ac01:

clip_image053

就看到所傳來的字串了。其程式碼為:

/* aco1.Java */

package com.misoo.ppxx;

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.LinearLayout;

public class ac01 extends Activity{

private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;

private Button btn, btn2;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

LinearLayout layout = new LinearLayout(this);

layout.setOrIEntation(LinearLayout.VERTICAL);

LinearLayout.LayoutParams param =

new LinearLayout.LayoutParams(100, WC);

param.topMargin = 5;

btn = new Button(this);

btn.setText("Go SubActivity");

btn.setOnClickListener(listener);

layout.addVIEw(btn, param);

btn2 = new Button(this);

btn2.setText("Exit");

btn2.setOnClickListener(listener);

layout.addVIEw(btn2, param);

this.setContentVIEw(layout);

EventActivity.setUpdateListener(new UpdateUIListener());

}

OnClickListener listener = new OnClickListener(){

public void onClick(VIEw v) {

if(v == btn){

Intent in = new Intent(ac01.this, EventActivity.class);

startActivity(in);

}

else if(v == btn2){

finish();

}

}

};

class UpdateUIListener implements IListener {

public void update(String s) {

setTitle(s);

}

}

}

/* EventActivity.Java */

package com.misoo.ppxx;

import android.app.Activity;

import android.os.Bundle;

import android.view.VIEw;

import android.view.VIEw.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

public class EventActivity extends Activity implements OnClickListener {

private static IListener plis;

private EditText et;

private Button btn;

public static void setUpdateListener(IListener listener) {

plis = listener;

}

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentVIEw(R.layout.event);

et=(EditText)findVIEwById(R.id.et);

btn = (Button)findVIEwById(R.id.send);

btn.setBackgroundResource(R.drawable.x_yellow);

btn.setOnClickListener(this);

}

public void onClick(VIEw v) {

plis.update(et.getText().toString());

finish();

}

}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved