2010/10/12

android dynamic GUI 動態介面--範例程式

先來看看 config 檔,
$ cat Sample.xml

<?xml version="1.0" encoding="UTF-8"?>
<cmds>
<cmd text="Test1" path="Add\add" params="3 5"/>
<cmd text="Test2" path="Add\add" params="7 9"/>
</cmds>


$ cat Sample1.xml

<?xml version="1.0" encoding="UTF-8"?>
<cmds>
<cmd text="umount sdcard" path="/system/bin/umount" params="/sdcard"/>
<cmd text="top" path="/system/bin/top" params=""/>
<cmd text="reboot" path="/system/bin/reboot" params=""/>
</cmds>


範例程式如下:

package com.example.helloandroid;

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import android.view.View;
import android.widget.LinearLayout;
import android.widget.Button;
import android.widget.TextView;

public class HelloAndroid extends Activity {
/** 底下這個是放分析 xml 完的內容,資料結構要自己再想過,或是直接以 DOM 的方式存取,而不必另外放也可以
也就是在外面也是用 Document doc 這個物件來存取
**/
String[][] items;

// 底下這三個是我們的 GUI 上會有的元件的「容器」
Button cmd[];
TextView cmdPath;
TextView cmdParam;

/** Called when the activity is first created. */
/** onCreate() 是每個應用程式的入口,所以算是一般 C 裡面的 main() **/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main); // 這個是原來的 HelloAndroid 範例程式,我們不需要原來的 layout 設計,用自己的方式
// 目前以 LinearLayout 來設計,可以改成矩陣式的,不過最好是可以容許橫拿直拿動態調整,第一版可以不必有此彈性功能
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(1);

// 呼叫我們的 XML file 分析載入函式
GetXMLInfo();

// 底下這三個是我們的 GUI 上會有的元件的「容器」
cmd = new Button[items.length];
cmdPath = new TextView(this);
cmdParam = new TextView(this);

/** 底下就是直接把 XML 內容, 也就是 items 拿來放到 GUI 上
資料結構可以改變,整個 GUI 也可以改變設計
**/
int iCmd;
for (iCmd=0; iCmd<items.length; iCmd++)
{
cmd[iCmd] = new Button(this);
cmd[iCmd].setId(iCmd);

/** 為每個 button 加上按鍵的事件以便做出反應 **/
cmd[iCmd].setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
cmdPath.setText(items[v.getId()][1]);
cmdParam.setText(items[v.getId()][2]);
}
});
cmd[iCmd].setText(items[iCmd][0]);
layout.addView(cmd[iCmd]); // 最後真正加到我們的 layout 中
}
// 上面的 for 迴圈是加按鍵,底下只是加上顯示訊息的文字區塊
layout.addView(cmdPath);
layout.addView(cmdParam);
setContentView(layout);
}
private void GetXMLInfo()
{
try{
File f=new File("/sdcard/Sample.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("cmd");

int _cmdLength = nl.getLength();
int _cmdAttributes=3;

items = new String[_cmdLength][_cmdAttributes];

for (int i=0;i<_cmdLength;i++){

items[i][0]= nl.item(i).getAttributes().getNamedItem("text").getNodeValue();
items[i][1]= nl.item(i).getAttributes().getNamedItem("path").getNodeValue();
items[i][2]= nl.item(i).getAttributes().getNamedItem("params").getNodeValue();

}

//System.out.println("cmd " + RecordS.length);

}
catch(Exception e){
e.printStackTrace();
}
}
}


執行時:
$ adb push Sample.xml /sdcard/Sample.xml
----呼叫該應用執行





----換成新的 GUI, 用新的 Sample1.xml 取代原先的 Sample.xml, 記得放的檔名是一樣的
$ adb push Sample1.xml /sdcard/Sample.xml
----呼叫該應用執行

0 意見: