2010年3月11日 星期四

Direct Web Remoting(DWR)简介

DWR可以在Web Application上直接处理XMLHttpRequest,因此你可以在 有的架构下利用DWR来产生Ajax的
效果。而且DWR非常简单,只要再web.xml加入DRW的Servlet并新增一个dwr.xml的设定档。就可以直接在Client端
利用Javascript直接唿叫Server端的Java方法。
以下建构一个简单的例子,在Client端输入一串字串,Servler端在收到这一个字串后,回传Client端输入的字串并回传
Server端目前系统时间。


1. 下载dwr.jar档。


2. 在web.xml加入DRW的Servlet。
<servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>
            org.directwebremoting.servlet.DwrServlet
    </servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>


3. 在WEB-INF下新增一个dwr.xml的设定档。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
    <allow>
        <create creator="new" javascript="AjFuns">
            <param name="class" value="tw.nicky.dwr.AjaxFunctions"/>
       </create>
    </allow>
</dwr>



4. 建立AjaxFunctions.class(此类别就是用户端要唿叫的类别)
package tw.nicky.dwr;
import java.util.Date;
public class AjaxFunctions {
    public String getEchoTime(String msg) {
        String result = "";
        result = result + "your input: "+msg+" ";
        result = result + "server time: "+new Date();
        return result;
    }
}




5.最后建立呈现在用户端的网页()
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>dwr_example</title>
        <script type='text/javascript' src='dwr/interface/AjFuns.js'></script>
        <script type='text/javascript' src='dwr/engine.js'></script>
        <script type='text/javascript'>
            function getEchoTime(){
                var msg = document.getElementById("msg").value;
                AjFuns.getEchoTime(msg,function(ret){
                    document.getElementById("results").innerHTML = ret;
                });

            }
        </script>
    </head>
    <body>
        <input type="text" id="msg">
        <input type="button" value="确定" onClick="getEchoTime()">
        <div id="results">
        </div>
    </body>
</html>


Java keytool 基本指令介绍

1. 匯入凭证到keystore
      keytool –import –alias xxx –file xxx.cer –keystore .keystore

2. 查询keystore的内容
      keytool –list –v –keystore .keystore

3. 删除keystore内的其中一个凭证
      keytool –delete –alias xxx –keystore .keystore

4. 产生金錀对(RSA为非对称加密的演算法)
      keytool -genkey -alias xxx -keyalg RSA -keystore .keystore

5. 产生凭证申请档
      keytool -certreq -alias xxx -file certreq.txt -keystore .keystore

6. 查询PKCS12类型keystore的内容
      keytool –list –v –keystore .keystore -storetype pkcs12

7. 建立一个含有私钥的keystore
      keytool -genkey -alias keyAlias -keyalg RSA -keystore keystore.jks

8. 修改keystore的密码
      keytool -storepasswd -new newPassword -keystore keystore.jks


Direct Web Remoting(DWR) - Reverse Ajax

1. 要使用DWR Reverse Ajax需先指定参数activeReverseAjaxEnabled为true。

<servlet>
   <servlet-name>dwr-invoker</servlet-name>
   <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
   <init-param>
     <param-name>debug</param-name>
     <param-value>true</param-value>
   </init-param>
   <init-param>
     <param-name>activeReverseAjaxEnabled</param-name>
     <param-value>true</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

2. 在要使用DWR Reverse Ajax的页面(reverseAjax.jsp)加入以下设定。

<!-- DWR相关的Javascript -->
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<!-- 页面载入时,即建立ReverseAjax连线 -->
<body onload="dwr.engine.setActiveReverseAjax(true);">
<!-- 从Server push回来的内容 -->
<span id="show"></span>


3. 触发要回传资料给Client端的Servlet。

ServerContext wctx = ServerContextFactory.get(this.getServletContext());
//取得要触发的页面
Collection sessions = wctx.getScriptSessionsByPage("/reverseAjax.jsp");
Util utilAll = new Util(sessions);
//设定回传的内容,并指定放到DOM的哪个id内
utilAll.setValue("show", "这是Server回传的资料");


Java Base64 Encode & Decode(编码和解码)

1. 下载所需的Jar档。(这里我们是使用Apache的commons-codec套件)

2. import org.apache.commons.codec.binary.Base64;

3. 使用Base64 Class进行编码与解码
Base64 base64 = new Base64();
//使用Base64进行字串编码
String encodeString = new String(base64.encode("This is source string.".getBytes()));
//输出结果将为"VGhpcyBpcyBzb3VyY2Ugc3RyaW5nLg=="
System.out.println(encodeString);
//使用Base64进行字串解码
String decodeString = new String(base64.decode(encodeString.getBytes()));
//输出结果将为"This is source string."
System.out.println(decodeString);


Java keytool 基本指令介绍

1. 匯入凭证到keystore
      keytool –import –alias xxx –file xxx.cer –keystore .keystore

2. 查询keystore的内容
      keytool –list –v –keystore .keystore

3. 删除keystore内的其中一个凭证
      keytool –delete –alias xxx –keystore .keystore

4. 产生金錀对(RSA为非对称加密的演算法)
      keytool -genkey -alias xxx -keyalg RSA -keystore .keystore

5. 产生凭证申请档
      keytool -certreq -alias xxx -file certreq.txt -keystore .keystore

6. 查询PKCS12类型keystore的内容
      keytool –list –v –keystore .keystore -storetype pkcs12

7. 建立一个含有私钥的keystore
      keytool -genkey -alias keyAlias -keyalg RSA -keystore keystore.jks

8. 修改keystore的密码
      keytool -storepasswd -new newPassword -keystore keystore.jks


Java - 使用iText输出pdf档(一) Hello world范例

1. 下载iText Jar档

2. Hello world范例。
FileOutputStream fos = new FileOutputStream(new File("C:/Hello world.pdf"));
//建立一个Document物件,并设定页面大小及左、右、上、下的边界
Document document = new Document(PageSize.A4, 10, 20, 30, 40);
//设定要输出的Stream
PdfWriter.getInstance(document, fos);
document.open();
//设定作者
document.addAuthor("Author");
//设定建立者
document.addCreator("createor");
//设定主题
document.addSubject("subject");
//设定标题
document.addTitle("title");
//设定建立时间(为当下时间)
document.addCreationDate();

document.add(new Phrase("Hello world\n"));

document.close();


Java - 使用iText输出pdf档(二) 中文字范例

1. 参考Java - 使用iText输出pdf档(一) Hello world范例

2. 设定中文字型。
//指定要使用的字型(KAIU.TTF为Windows内建的标楷体)
BaseFont bf = BaseFont.createFont("C:\\WINDOWS\\Fonts\\KAIU.TTF", BaseFont.IDENTITY_H,  BaseFont.NOT_EMBEDDED);
//设定中文字型(BaseFont、字型大小、字型型态)
Font chineseFont = new Font(bf, 12, Font.NORMAL);
//套用中文字型
document.add(new Phrase("这是中文",chineseFont));


Java - 使用iText输出pdf档(三) 表格(table)范例

1. 参考Java - 使用iText输出pdf档(一) Hello world范例

2. 表格(table)范例。
//建立PdfPTable物件并设定其栏位数
PdfPTable table = new PdfPTable(2);
//设定table的宽度
table.setWidthPercentage(100f);
//设定每个栏位的宽度
table.setWidths(new float[]{0.20f, 0.90f});

PdfPCell title = new PdfPCell();
//合併储存格
title.setColspan(2);
title.addElement(new Phrase("Table's Title"));
table.addCell(title);

//设定第一个栏位的内容
PdfPCell cell_1 = new PdfPCell();
cell_1.addElement(new Phrase("Column 1"));
table.addCell(cell_1);

//设定第二个栏位的内容
PdfPCell cell_2 = new PdfPCell();
cell_2.addElement(new Phrase("Column 2"));
table.addCell(cell_2);

document.add(table);


Java string to int(字串转整数)

1. int intValue = Integer.valueOf("12345");

2. int intValue = Integer.parseInt("12345");


Java int to String(整数转字串)

1. String stringValue = Integer.toString(12345);

2. String stringValue = String.valueOf(12345);

3. String stringValue = new String(""+12345);


Java string split(字串切割)

Java字串切割范例
//欲切割的字串
String splitString = "Bob:Stev:David:John";
//使用「:」进行切割
String[] names = splitString.split(":");
for(String name:names){
    System.out.println(name);
}

输出结果
Bob
Stev
David
John


Java string to date(字串转日期)

Java字串转日期范例
//欲转换的日期字串
String dateString = "20010-03-02 20:25:58";
//设定日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//进行转换
Date date = sdf.parse(dateString);
System.out.println(date);

输出结果
Tue Mar 02 20:25:58 CST 20010


Java date to string(日期转字串)

Java 日期转字串范列
//目前时间
Date date = new Date();
//设定日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//进行转换
String dateString = sdf.format(date);
System.out.println(dateString);


输出结果
2010-03-02 19:15:57


Java AES Encrypt & Decrypt Example(加解密)

范例程式
//欲加密的字串
String msg = "This is a message.";
System.out.println("原始字串:"+new String(msg));
//设定要使用的加密演算法
KeyGenerator keyG = KeyGenerator.getInstance("AES");
//设定key的长度
keyG.init(256);
//产生SecretKey
SecretKey secuK = keyG.generateKey();
//取得要用来加密的key(解密也需使用这把key)
byte[] key = secuK.getEncoded();
System.out.println("key:"+new String(key));
SecretKeySpec spec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
//设定为加密模式
cipher.init(Cipher.ENCRYPT_MODE, spec);
//将字串加密,并取得加密后的资料
byte[] encryptData = cipher.doFinal(msg.getBytes());
System.out.println("加密后字串:"+new String(encryptData));

//使用刚刚用来加密的key进行解密
spec = new SecretKeySpec(key, "AES");
cipher = Cipher.getInstance("AES");
//设定为解密模式
cipher.init(Cipher.DECRYPT_MODE, spec);
byte[] original = cipher.doFinal(encryptData);
System.out.println("解密后字串:"+new String(original));

输出结果
原始字串:This is a message.
key:�U{� jPk ���@7 .�A@��&]W LK���ݣ
加密后字串:��� � ����tl7Q U!���d�{4R) �� .
解密后字串:This is a message.


2010年3月2日 星期二

建立Facebook应用程式 Java API (7) - 使用XFBML建立邀请页面

1. 需先完成开始使用XFBML步骤。

2. 加入XFBML邀请页面程式码。
<fb:serverfbml>
    <script type="text/fbml">
      <fb:request-form action="http://apps.facebook.com/votequestionnaire/"
         target="_top" method="POST" invite="true" type="type"
         content="content <fb:req-choice url='http://apps.facebook.com/votequestionnaire/' label='label' />">

        <fb:multi-friend-selector showborder="false"
           actiontext="actiontext" exclude_ids="1111111,222222,333333"
           rows="5" cols="5" bypass="cancel" target="_top" max="25" email_invite="false" />
      </fb:request-form>
    </script>
</fb:serverfbml> 
3. 邀请页面结果如下。(actiontext对应到fb:multi-friend-selector的actiontext属性丶type则对应到fb:request-form的type属性)

4. 邀请函结果如下。(content对应到fb:request-form的content属性丶label对应到fb:req-choice的label属性)










建立Facebook应用程式 Java API (6) - 开始使用XFBML

1. 建立crossDomain.jsp。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
    <head> <title>Cross-Domain Receiver Page</title>
    </head>
    <body>
        <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js?2" type="text/javascript">
        </script>
    </body>
</html>


2. 修改联外通网址(为放置crossDomain.jsp的同一个domain)。



3. 建立需要使用XFBML的网页。

   a. 需使用取代原有的<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">取代原有的<html>
   b. <body>在之後加入二个script
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US" type="text/javascript"></script>
<script type="text/javascript">
FB_RequireFeatures(["XFBML"], function(){ FB.Facebook.init("你的apiKey", "crossDomain.jsp位置"); });
</script>


建立Facebook应用程式 Java API (5) - 取得朋友Profile内的资料

//设定要取得的栏位
 Set fields = new HashSet();
 fields.add(ProfileField.SEX.fieldName()); //性别
 fields.add(ProfileField.NAME.fieldName()); //姓名
 fields.add(ProfileField.BIRTHDAY.fieldName()); //生日
 fields.add(ProfileField.PIC_SMALL.fieldName()); //大头照

 //取得所有朋友的Uid
 List friendsUid = client.friends_get().getUid();

 //取得使用者资讯
 List users = client.users_getInfo(friendsUid, fields).getUser();
 for(User user:users) {
     user.getSex(); //男:male 女:female
     user.getName();
     user.getBirthday();
     user.getPicSmall(); //大头照图片网址
 } 


2010年2月25日 星期四

建立Facebook应用程式 Java API (4) - 发布通知及张贴讯息到涂鸭墙

利用Facebook API可以发布通知给使用者的朋友,也可以贴讯息到使用者的涂鸭墙上。

1. 发布通知给使用者的朋友
List reciver = new ArrayList();
reciver.add(friendsUID);
client.notifications_send(reciver, "msg"); 

2.  贴讯息到使用者的涂鸭墙上
// 贴讯息到使用者的涂鸭墙上(每个使用者一日限十篇)
// 设定张贴的讯息
Attachment attachment = new Attachment();
attachment.setName("Name");
//设定Name的超连结位址
attachment.setHref("http://www.google.com.tw/");
attachment.setCaption("caption");
attachment.setDescription("yahoo description\ntest");

//加入图片
AttachmentMediaImage attachmentMediaImage = new AttachmentMediaImage("http://www.google.com.tw/intl/en_com/images/logo_plain.png", "http://www.google.com");
attachment.setMedia(attachmentMediaImage);

//ActionLink是会出现在'留言 · 赞'後面的超连结(只有发布到自己的涂鸭墙才会出现)
List actionLiks = new ArrayList();
BundleActionLink bundleActionLink = new BundleActionLink("yahoo", "http://tw.yahoo.com");
actionLiks.add(bundleActionLink);

//发布到涂鸭墙
client.stream_publish("This is a Java API Test.", attachment, actionLiks, null, null);


建立Facebook应用程式 Java API (3) - 利用API取得使用者相关资讯

透过Facebook API可以取得使用者Profile内的资料(除了Email)丶使用者所有朋友的Profile资料(如:名子丶性别丶图片…)以及和应用程式相关的资料。

String sessionKey = request.getParameter("fb_sig_session_key");
 FacebookJaxbRestClient client = new FacebookJaxbRestClient(apiKey, secret, sessionKey);

  //使用者UID
  Long userId = client.users_getLoggedInUser();

 //使用者的所有friends
  List friendsUID = client.friends_get().getUid();

  //使用者friend的分类
  List friendLists = client.friends_getLists().getFriendlist();

  //有使用此应用程式的friends
  List appUsers = client.friends_getAppUsers().getUid();

  //检查应用程式是否有发布讯息到使用者涂鸭墙的权限(也可利用此方法来检查其它权限)
  boolean publish  = client.users_hasAppPermission(Permission.PUBLISH_STREAM);

  //使用者授权的连结
  String url = Permission.authorizationUrl(apiKey, Permission.PUBLISH_STREAM); 


建立Facebook应用程式 Java API (2) - 开始使用Java API

1. 下载Java API

2. 将所需的Jar档汇入

3. 建立一个Servlet(此Servlet的位址需是Canvas Callback URL)

4. 撰写此Servlet
     a. 藉由fb_sig_session_key参数来判断该FB使用者是否有加入此应用程式
            String sessionKey = request.getParameter("fb_sig_session_key");
     b. 若sessionKey为null则表示该FB使用者未加入此应用程式,则将网页重新导向到要求允许存取页面
           <script type='text/javascript'>
                parent.location.href='http://www.facebook.com/login.php?v=1.0&api_key=[your_api_key]&
               next=[Canvas Callback URL]&canvas=';
            </script>
     c. 若sessionKey不为null,则可使用api_key, secret, seessionKey来取得FacebookJaxbRestClient
             FacebookJaxbRestClient client = new FacebookJaxbRestClient(api_key, secret, seessionKey);


建立Facebook应用程式 Java API (1) - 申请应用程式

1. 加入开发人员应用程式
 
2. 建立一个新的应用程式

3.  输入应用程式名称

4.  记住自己应用程式的ID, API key, Secret

5. 选择画布(Canvas),并输入你的Canvas url(需小写)及你的server的url

6.  应用程式的细节




Android学习笔记 - 长按选单(ContextMenu)

1. 在萤幕按下2至3秒之後出现选单,这是使用ContextMenu物件来达到此效果

2. 需覆写onCreateContextMenu及onContextItemSelected这二个方法

3. MainActivity.java
package org.me.android_contextmenu;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        LinearLayout windowLayout = (LinearLayout) findViewById(R.id.windowLayout);
        //注册长按选单
        this.registerForContextMenu(windowLayout);
    }


    @Override
    public boolean onContextItemSelected(MenuItem item) {
        //当使用者点选项目时,所需的动作
        Toast.makeText(this, "您选择的是"+item.getTitle(), Toast.LENGTH_SHORT).show();
        return super.onContextItemSelected(item);
    }


    @Override
    public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenuInfo menuInfo) {
        //设定选单内容
        super.onCreateContextMenu(contextMenu, view, menuInfo);
        contextMenu.add(0, 0, 0, "红茶");
        contextMenu.add(0, 1, 0, "奶茶");
        contextMenu.add(0, 2, 0, "绿茶");
        contextMenu.add(0, 3, 0, "青茶");
    }
}


3. main.xml(Layout)




4. 执行之後的画面。



Android学习笔记 - 网格视图(GridView)

1. 利用网格视图(GridView)物件来呈现项目列表

2. MainActivity.java
package org.me.android_gridview;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private GridView gridView;
    
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        gridView = (GridView) findViewById(R.id.gridView);
        final String[] list = new String[]{"王建民","郭泓志","倪福德","胡金龙"};
        //设定列表内容
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,list);
        //设定列数
        gridView.setNumColumns(2);
        gridView.setAdapter(adapter);
        //项目被点选时,回应的动作
        gridView.setOnItemClickListener(new GridView.OnItemClickListener(){
           @Override
           public void onItemClick(AdapterView adapterView,View view,int position,long id) {
               Toast.makeText(MainActivity.this, "您选择的是"+list[position], Toast.LENGTH_SHORT).show();
           }
        });
    }
}


3. main.xml(Layout)
<
" 
    
    



4. 执行之後的画面。


Android学习笔记 - 自动填入文字(AutoCompleteTextView)

1. 利用(AutoCompleteTextView)物件来达到自动填入文字

2. MainActivity.java
package org.me.android_autocompletetextview;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class MainActivity extends Activity {
    private AutoCompleteTextView autoComplete;
    
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        autoComplete = (AutoCompleteTextView) findViewById(R.id.autoComplete);
        String[] phone = new String[]{"0986254878","0985225787","098525879","0985012486","0985658745"};
        //设定自动填入的文字内容
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item,phone);
        autoComplete.setAdapter(adapter);
    }
}


3. main.xml(Layout)
" 
    
    



4. 在「自动填入文字框」输入文字之後出现的画面。


Android学习笔记 - 下拉式选单(Spinner)

1. 透过Spinner物件建立下拉式选单

2. MainActivity.java
package org.me.android_spinner;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        Spinner spinner = (Spinner) findViewById(R.id.spinnner);
        //建立一个ArrayAdapter物件,并放置下拉选单的内容
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item,new String[]{"红茶","奶茶","绿茶"});
        //设定下拉选单的样式
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        //设定项目被选取之後的动作
        spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
            public void onItemSelected(AdapterView adapterView, View view, int position, long id){
                Toast.makeText(MainActivity.this, "您选择"+adapterView.getSelectedItem().toString(), Toast.LENGTH_LONG).show();
            }
            public void onNothingSelected(AdapterView arg0) {
                Toast.makeText(MainActivity.this, "您没有选择任何项目", Toast.LENGTH_LONG).show();
            }
        });
    }
}


3. main.xml(Layout)

    
    
    
    



4. 下拉式选单画面


Android学习笔记 - 传递参数到下一个Activity

1. 透过Bundle物件传递参数到下一个Activity

2. 第一个Activity(MainActivity.java)
package org.me.android_transferparam;
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 MainActivity extends Activity {
    private Button nextButton;
    private EditText nameEdit;
    private EditText phoneEdit;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        //载入所有的Widget
        loadWidget();
        
        nextButton.setOnClickListener(new Button.OnClickListener(){
           @Override
           public void onClick(View view){
               //传送参数到下一个Actitity
               deliverToNextActitity();
           }
        });
    }

    public void deliverToNextActitity(){
        //建立一个bundle物件,并将要传递的参数放到bundle里
        Bundle bundle = new Bundle();
        bundle.putString("name", nameEdit.getText().toString());
        bundle.putString("phone", phoneEdit.getText().toString());
        Intent intent = new Intent();
        //设定下一个Actitity
        intent.setClass(this, SecondActivity.class);
        intent.putExtras(bundle);
        //开启Activity
        startActivity(intent);
    }

    private void loadWidget(){
        nextButton = (Button) findViewById(R.id.nextButton);
        nameEdit = (EditText) findViewById(R.id.nameEdit);
        phoneEdit = (EditText) findViewById(R.id.phoneEdit);
    }
}

3. 第二个Activity(SecondActivity.java)
package org.me.android_transferparam;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class SecondActivity extends Activity {

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.second);
        TextView content = (TextView) findViewById(R.id.content);
        Button backButton = (Button) findViewById(R.id.backButton);
        //取得前一个Activity传过来的Bundle物件
        Bundle bundle = getIntent().getExtras();
        content.setText("姓名:"+bundle.getString("name")+"   电话:"+bundle.getString("phone"));

        backButton.setOnClickListener(new Button.OnClickListener(){
           @Override
           public void onClick(View view){
               //结束此Activity
               finish();
           }
        });
    }
}

4. main.xml(Layout)

    
    
    
    
    
    
    
    
    


5. second.xml(Layout)
"
    
    
    


6. 程式启动及输入参数之後的画面


Android学习笔记 - 多选项对话框(Dialog)

1. 利用AlertDialog物件来显示对话框,并利用字串阵列来标示选项的标题。

2. MainActivity.java
package org.me.android_multiitemdialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    private Button showDialogButton;
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        showDialogButton = (Button) findViewById(R.id.showDialogButton);
        final AlertDialog mutiItemDialog = getMutiItemDialog(new String[]{"牛排","鸡排","猪排"});

        showDialogButton.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View view){
                //显示对话框
                mutiItemDialog.show();
            }
        });
    }

    public AlertDialog getMutiItemDialog(final String[] items) {
        Builder builder = new Builder(this);
        //设定对话框内的项目
        builder.setItems(items, new DialogInterface.OnClickListener(){
           @Override
           public void onClick(DialogInterface dialog,int which){
               //当使用者点选对话框时,显示使用者所点选的项目
               Toast.makeText(MainActivity.this, "您选择的是"+items[which], Toast.LENGTH_SHORT).show();
           }
        });
        return builder.create();
    }
}

3. main.xml(Layout)
" 
    

4. 按下「多个选项的对话框」按钮之後出现的画面。


Android学习笔记 - 对话框(Dialog)

1. 利用AlertDialog物件来显示对话框。

2. MainActivity.java
package org.me.android_dialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
    private Button dialogButton;
    
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        dialogButton = (Button) findViewById(R.id.dialogButton);
        final AlertDialog alertDialog = getAlertDialog("这是一个对话框","请选择......");
        dialogButton.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(final View view) {
                //显示对话框
                alertDialog.show();
            }
        });
    }

    private AlertDialog getAlertDialog(String title,String message){
        //产生一个Builder物件
        Builder builder = new AlertDialog.Builder(MainActivity.this);
        //设定Dialog的标题
        builder.setTitle(title);
        //设定Dialog的内容
        builder.setMessage(message);
        //设定Positive按钮资料
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //按下按钮时显示快显
                Toast.makeText(MainActivity.this, "您按下OK按钮", Toast.LENGTH_SHORT).show();
            }
        });
        //设定Negative按钮资料
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //按下按钮时显示快显
                Toast.makeText(MainActivity.this, "您按下Cancel按钮", Toast.LENGTH_SHORT).show();
            }
        });
        //利用Builder物件建立AlertDialog
        return builder.create();
    }
}

3. main.xml(Layout)
" 
    


4. 按下ShowDialog按钮之後出现的画面


Android学习笔记 - 显示快显(Toast)

1. 利用Toast物件来显示快显。

2. MainActivity.java
package org.me.android_toast;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
    private Button toastButton;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        toastButton = (Button) findViewById(R.id.toastButton);

        //设定按钮的ClickListener
        toastButton.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View view) {
                //当使用者按下按钮时显示Toast
                //Toast.LENGTH_LONG表示显示时间较长,Toast.LENGTH_SHORT则表示显示时间较短
                Toast.makeText(view.getContext(), "这是一个Toast......", Toast.LENGTH_LONG).show();
            }
        });
    }
}

3. main.xml(Layout)

    



4. 按下ShowToast按钮之後出现的画面


Android学习笔记 - 建立选单(Menu)

1. 利用覆写onCreateOptionsMenu, onOptionsItemSelected这二个方法来建立选单。

2. MainActivity.java
package org.me.android_menu;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity {
    private TextView describe;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        describe = (TextView) findViewById(R.id.describe);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //参数1:群组id, 参数2:itemId, 参数3:item顺序, 参数4:item名称
        menu.add(0, 0, 0, "说明");
        menu.add(0, 1, 1, "离开");
        return super.onCreateOptionsMenu(menu);
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //依据itemId来判断使用者点选哪一个item
        switch(item.getItemId()) {
            case 0:
                //在TextView上显示说明
                describe.setText("这是说明............");
                break;
            case 1:
                //结束此程式
                finish();
                break;
            default:
        }
        return super.onOptionsItemSelected(item);
    }
}
3. main.xml(Layout)
" 
    

4. 按下MENU键之後出现及点选「说明」之後出现的画面






Android學習筆記 - Hello World

使用TextView秀出Hello World

1. MainActivity.java
package org.me.android_helloworld;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        //设定要使用的layout
        setContentView(R.layout.main);
        //取得TextView物件
        TextView view = (TextView) findViewById(R.id.textView);
        view.setText("hellworld");
    }
}

2. main.xml
" 
    


3. AndroidManifest.xml

    
         
            
                
                
            
        
    


4. 结果


Android学习笔记 - 安装Netbeans 6.7 Android Plugin

1. 选择Tools -> Plugins



2. 选择Setting并按下新增



3. 输入Plugin的URL http://kenai.com/downloads/nbandroid/updates.xml



4.  到Avalible Plugins找到Android并安装



5. 安装完成後,新增一个Android的专案



6.  选择Manage Platforms



7. 新增一个Android Platform






8. 选择Android SDK的安装位置




 9.选择要使用的Target