對話框通知(Dialog Notification)
當你的應用需要顯示一個進度條或需要使用者對資訊進行确認時,可以使用對話框來完成。
對話框和菜單一樣,都是由Activity統一管理的,我們隻要重新實作onCreateDialog(int id)傳近來的不同的對話id,初始化并傳回相應的對話框。Activity會将所有你已經初始化的對話框儲存,下次呼出對話框的時候不會重新初始化。是以當需要動态更新我們的對話框時,就需要重新實作onPrepareDialog(int id,Dialog dialog)方法。
下面代碼将打開一個對話框:
new AlertDialog.Builder(this)
.setTitle("zyj标題")
.setCancelable(false) //設定不能通過“後退”按鈕關閉對話框
.setMessage("zyj浏覽我的bolg?")
.setPositiveButton("确認",new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialoginterface, int i){
Uri uri = Uri.parse("http://justsee.iteye.com/");//打開連結
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
})
.show();//顯示對話框
上面代碼采用的是一個鍊式調用,像setTitle()、setMessage()這些方法,他們的傳回值都是目前對話框對象。
單選框(RadioButton)
在radio.xml中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RadioGroup android:id="@+id/radioGroup"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<RadioButton android:id="@+id/small" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="small" />
<RadioButton android:id="@+id/middle"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="middle" />
<RadioButton android:id="@+id/big" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="big" />
</RadioGroup>
</LinearLayout>
在RadioButtonActivity中:
......
// xml實作
setContentView(R.layout.radio);
RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
radioGroup.check(R.id.middle);// 設定成預設選項
Log.i(TAG,
"預設選中的是:"
+ ((RadioButton) this.findViewById(radioGroup
.getCheckedRadioButtonId())).getText()
.toString());
radioGroup
.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton radioButton = (RadioButton) findViewById(checkedId);
Log.i(TAG, String.valueOf(radioButton.getText()));
}
});
/*
使用到RadioGroup和RadioButton(單選框),RadioGroup用于對單選框進行分組,相同組内的單選框隻有一個單選框能被選中。(例子代碼請見下方備注欄)
RadioGroup.check(R.id.dotNet);将id名為dotNet的單選框設定成選中狀态。
(RadioButton) findViewById(radioGroup.getCheckedRadioButtonId());//擷取被選中的單選框。
RadioButton.getText();//擷取單選框的值
調用setOnCheckedChangeListener()方法,處理單選框被選擇事件,把RadioGroup.OnCheckedChangeListener執行個體作為參數傳入
*/
final String[] items = { "海", "陸", "空" };
new AlertDialog.Builder(this).setTitle("選擇軍隊")
.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item],
Toast.LENGTH_SHORT).show();
}).show();// 顯示對話框
final String[] itemsa = { "紅", "黃", "燈" };
new AlertDialog.Builder(this)
.setTitle("選擇燈顔色")
// setSingleChoiceItems()的第二個參數是設定預設選項,選項索引從0開始,-1代表不選擇任何選項。
.setSingleChoiceItems(itemsa, 1,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(),itemsa[item], Toast.LENGTH_SHORT).show();dialog.cancel();
}
}).show();
多選框(CheckBox)
checkbox.xml界面
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<CheckBox android:id="@+id/checkboxjava"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="java" />
<CheckBox android:id="@+id/checkboxdotNet"
android:text="dotNet" />
<CheckBox android:id="@+id/checkboxphp"
android:text="PHP" />
<Button android:id="@+id/checkboxButton"
android:layout_width="fill_parent"
android:text="擷取值" />
CheckBoxActivity中
............................
public class CheckBoxActivity extends Activity {
private static final String TAG = "CheckBoxActivity";
private List<CheckBox> checkboxs = new ArrayList<CheckBox>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
/* 每個多選框都是獨立的,可以通過疊代所有多選框,然後根據其狀态是否被選中再擷取其值。
CheckBox.setChecked(true);//設定成選中狀态。
CheckBox.getText();//擷取多選框的值
調用setOnCheckedChangeListener()方法,處理多選框被選擇事件,把CompoundButton.OnCheckedChangeListener執行個體作為參數傳入*/
setContentView(R.layout.checkbox);
checkboxs.add((CheckBox) findViewById(R.id.checkboxdotNet));
checkboxs.add((CheckBox) findViewById(R.id.checkboxjava));
checkboxs.add((CheckBox) findViewById(R.id.checkboxphp));
checkboxs.get(1).setChecked(true);// 設定成選中狀态
for (CheckBox box : checkboxs) {
box.setOnCheckedChangeListener(listener);
}
Button button = (Button) findViewById(R.id.checkboxButton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<String> values = new ArrayList<String>();
for (CheckBox box : checkboxs) {
if (box.isChecked()) {
values.add(box.getText().toString());
}
Toast.makeText(CheckBoxActivity.this, values.toString(), 1)
.show();
}
});
}
CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() {
@Override
// isChecked表示是否被選中
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
CheckBox checkBox = (CheckBox) buttonView;
Log.i(TAG,
"isChecked=" + isChecked + ",value=" + checkBox.getText());// 輸出單選框的值
};
CheckBoxActivity中
//多選項清單對話框
final String[] items = {"java", ".net", "php"};
new AlertDialog.Builder(this).setCancelable(false)
.setTitle("選擇語言")
.setMultiChoiceItems(items, new boolean[]{false,true,false}, new DialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if(isChecked){
Toast.makeText(getApplicationContext(), items[which],
Toast.LENGTH_SHORT).show();
.setPositiveButton("确認",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialoginterface, int i){
dialoginterface.dismiss();//解除對話框
}
.show();//顯示對話框
下拉清單框(Spinner)
在spinner.xml中(圖一圖二圖三用)
android:layout_width="fill_parent"
<Spinner android:id="@+id/spinner"
android:layout_width="fill_parent"/>
stylespinner.xml中(圖三用)
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/contentTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#F4FDFF"
/>
SpinnerActivity中(圖一圖二圖三用)
public class SpinnerActivity extends Activity {
private static final String TAG = "SpinnerActivity";
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.spinner);
/*// 第二個參數為下拉清單框每一項的界面樣式,該界面樣式由Android系統提供,當然您也可以自定義
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);//換一種下拉框的式樣
adapter.add("java");
adapter.add("dotNet");
adapter.add("php");
Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);
// spinner.setSelection(0, false);
spinner.setSelection(2);//設定預設值
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
int position, long id) {
Spinner spinner = (Spinner) adapterView;
String itemContent = (String) adapterView
.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), itemContent,Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> view) {
Log.i(TAG, view.getClass().getName());
});*/
/////////////////////////////采用javabean作為Adapter元素(圖二)///////////////////////////////////////////////
/* ArrayAdapter<Person> adapter = new ArrayAdapter<Person>(this, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
adapter.add(new Person(12, "李明"));
adapter.add(new Person(100, "李明"));
adapter.add(new Person(62, "張天"));
Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
Spinner spinner = (Spinner)adapterView;
Person person = (Person)adapterView.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), person.getId().toString(),Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> view) {
Log.i(TAG, view.getClass().getName());
});*/
/////////////////////////////自定義選項界面樣式(圖三)///////////////////////////////////////////////
//第二個參數為layout檔案在R檔案的id,第三個參數為TextView在layout檔案的id
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.stylespinner, R.id.contentTextView);
adapter.add("java");
adapter.add("dotNet");
adapter.add("php");
Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
Spinner spinner = (Spinner)adapterView;
String itemContent = (String)adapterView.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), itemContent,Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> view) {
Log.i(TAG, view.getClass().getName());
拖動條(SeekBar)
seekbar.xml
android:layout_height="fill_parent"
android:orientation="vertical">
<SeekBar
android:id="@+id/seekBar"
<Button android:id="@+id/seekBarButton"
android:text="擷取值"
SeekBarAvtivity中
private SeekBar seekBar;
setContentView(R.layout.seekbar);
seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setMax(100);//設定最大刻度,即0到99
seekBar.setProgress(30);//設定目前刻度
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
Log.v("onProgressChanged()", String.valueOf(progress) + ", " + String.valueOf(fromTouch));
public void onStartTrackingTouch(SeekBar seekBar) {//開始拖動
Log.v("onStartTrackingTouch()", String.valueOf(seekBar.getProgress()));
public void onStopTrackingTouch(SeekBar seekBar) {//結束拖動
Log.v("onStopTrackingTouch()", String.valueOf(seekBar.getProgress()));
Button button = (Button)this.findViewById(R.id.seekBarButton);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(getApplicationContext(), String.valueOf(seekBar.getProgress()), 1).show();
});
菜單(Menu)
·重寫Activity的onCreateOptionsMenu(Menu menu)方法,該方法用于建立選項菜單,在使用者按下手機的“Menu”按鈕時就會顯示建立好的菜單,在onCreateOptionsMenu(Menu menu)方法内部可以調用Menu.add()方法實作菜單的添加。
在第一次初始化了選項菜單後,如果我們需要動态更改選項菜單的話,則需要重新實作onPrepareOptionsMenu()回調方法,他會在每次顯示選項菜單之前調用。
·重寫Activity的onMenuItemSelected()方法,該方法用于處理菜單被選擇事件
在MainActivity中:
private static final int MENU_ADD = Menu.FIRST;
private static final int MENU_UPDATE = Menu.FIRST + 1;
...............................................................
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(Menu.NONE, MENU_ADD, Menu.NONE, "添加");<span style="color: #ff0000;">//參數:組ID,菜單項ID,排列順序,顯示标題 </span>
menu.add(Menu.NONE, MENU_UPDATE, Menu.NONE, "更新");
return super.onCreateOptionsMenu(menu);
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case MENU_ADD:
Log.i(TAG, "add was selected");
return true;
case MENU_UPDATE:
Log.i(TAG, "update was selected");
default:
return super.onMenuItemSelected(featureId, item);
}
}
子菜單(SubMenu)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(Menu.NONE, MENU_ADD, Menu.NONE, "添加").setCheckable(true);
menu.add(Menu.NONE, MENU_UPDATE, Menu.NONE, "更新");
SubMenu sub = menu.addSubMenu("搜尋");//子菜單
<span style="color: #ff0000;"> sub.setIcon(android.R.drawable.ic_menu_search);
sub.add(Menu.NONE,Menu.FIRST+8,Menu.NONE,"本地");
sub.add(Menu.NONE,Menu.FIRST+9,Menu.NONE,"網絡");</span>
menu.add(Menu.NONE, Menu.FIRST+2, Menu.NONE, "儲存").setIcon(android.R.drawable.ic_menu_save);
menu.add(Menu.NONE, Menu.FIRST+3, Menu.NONE, "删除").setIcon(android.R.drawable.ic_menu_delete);
menu.add(Menu.NONE, Menu.FIRST+4, Menu.NONE, "增加").setIcon(android.R.drawable.ic_menu_add);
menu.add(Menu.NONE, Menu.FIRST+5, Menu.NONE, "電話").setIcon(android.R.drawable.ic_menu_call);
menu.add(Menu.NONE, Menu.FIRST+6, Menu.NONE, "電話1");
menu.add(Menu.NONE, Menu.FIRST+7, Menu.NONE, "電話2");
return super.onCreateOptionsMenu(menu);
}
上下文菜單(ContextMenu)
上下文菜單的初始化回調方法并不隻調用一次,它會在每次呼出上下文菜單時被調用(public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) )。
方法一:注冊
...
registerForContextMenu(findViewById(R.id.contextMenu));//注冊上下文菜單
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case C_MENU_NEW:
//做建立的那些事。
break;
case C_MENU_OPEN:
//做打開的那些事。
}
return super.onContextItemSelected(item);
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("這是上下文菜單");
menu.add(0, C_MENU_NEW, 0, "建立");
menu.add(0, C_MENU_OPEN, 0, "打開");
super.onCreateContextMenu(menu, v, menuInfo);
方法二:監聽
((Button)this.findViewById(R.id.contextMenu2)).setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("這是上下文菜單2");
menu.add(0, C_MENU_NEW, 0, "建立");
menu.add(0, C_MENU_OPEN, 0, "打開");
});
進度對話框(ProgressDialog)
·使用代碼ProgressDialog.show(ProgressDialogActivity.this, "請稍等", "資料正在加載中...", true);建立并顯示一個進度對話框。
·調用setProgressStyle()方法設定進度對話框風格。有兩種風格:
ProgressDialog.STYLE_SPINNER 旋體進度條風格 (為預設風格)
ProgressDialog.STYLE_HORIZONTAL 橫向進度條風格
.........................................................
private ProgressDialog progressDialog;//進度對話框
private Runnable finishDialog = new Runnable() {
@Override
public void run() {
progressDialog.dismiss();
}
progressDialog = ProgressDialog.show(MainActivity.this, "請稍等", "病毒正在加載中...", true);
//開始一條專門處理耗時工作的線程
new Thread(new Runnable(){
public void run() {
try {
Thread.sleep(5*1000);//假設這項工作需要5秒才能完成
//progressDialog.dismiss();//關閉程序對話框
runOnUiThread(finishDialog);//要求運作在UI線程
} catch (InterruptedException e) {}
}).start();
................................................................
建立進度條(ProgressBar)
在布局xml檔案中添加進度條代碼:
<ProgressBar android:layout_width="fill_parent" android:layout_height="20px"
style="?android:attr/progressBarStyleHorizontal"
android:id="@+id/downloadbar"/>
在代碼中操作進度條:
ProgressBar.setMax(100);//設定總長度為100
ProgressBar.setProgress(0);//設定已經開啟長度為0,假設設定為50,進度條将進行到一半
一般用于下載下傳的進度條
Android中的通知(Notification)
通知用于在狀态欄顯示消息,消息到來時以圖示方式表示,如下:
在MainActivity中:
..................
//擷取通知管理器
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
int icon = android.R.drawable.stat_notify_chat;
long when = System.currentTimeMillis();
//建立一個通知,指定其圖示和标題
Notification notification = new Notification(icon, null, when);//第一個參數為圖示,第二個參數為标題,第三個為通知時間
Intent openintent = new Intent(this, CodeUIActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, openintent, 0);//當點選消息時就會向系統發送openintent意圖
notification.setLatestEventInfo(this, "标題", "内容", contentIntent);
mNotificationManager.notify(0, notification);
DatePicherDialog
new DatePickerDialog(this,
new OnDateSetListener() {
@Override
public void onDateSet(DatePicker v, int y,
int m, int d) {
/*
* 這是設定好日期後的回調函數,
* 可以根據設定的内容更新使用者界面
* 或者系統時間。
*/
}
}, c.get(Calendar.YEAR),
c.get(Calendar.MONTH),
c.get(Calendar.DAY_OF_MONTH))
TimePicherDialog
new TimePickerDialog(this,
new OnTimeSetListener() {
public void onTimeSet(TimePicker arg0, int arg1, int arg2) {
/*
* 這是設定好時間後的回調函數,
}, c.get(Calendar.HOUR_OF_DAY),
c.get(Calendar.MINUTE),
false);
AnalogClock 和 DigitalClock
<AnalogClock
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
lt;DigitalClock
ToggleButton
<ToggleButton
android:layout_height="wrap_content" />
在Activity中程式設計實作UI
在CodeUIActivity中:
TextView textView = new TextView(this);
textView.setText(R.string.code_UI);
textView.setId(90);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
linearLayout.addView(textView, params);
params = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(linearLayout, params);
用html作為UI
Android通過WebView實作了JS代碼與Java代碼互相通信的功能,使的android軟體的界面開發也可以采用HTML網頁技術。
主要代碼
/assets/index.html
<script type="text/javascript">
function show(jsondata){//[{id:21,name:"xxx",mobile:"12332213"},{}]
var jsonobjs = eval(jsondata);
var table = document.getElementById("personTable");
for(var y=0; y<jsonobjs.length; y++){
var tr = table.insertRow(table.rows.length); //添加一行
//添加三列
var td1 = tr.insertCell(0);
var td2 = tr.insertCell(1);
td2.align = "center";
var td3 = tr.insertCell(2);
//設定列内容和屬性
td1.innerHTML = jsonobjs[y].id;
td2.innerHTML = jsonobjs[y].name;
td3.innerHTML = "<a href='javascript:cactus.call(\""+ jsonobjs[y].mobile+ "\")'>"+ jsonobjs[y].mobile+ "</a>";
</script>
</head>
<!-- js代碼通過webView調用其插件中的java代碼 -->
<body onload="javascript:cactus.personlist()">
<table border="0" width="100%" id="personTable" cellspacing="0">
<tr>
<td width="20%">編号</td>
<td width="30%" align="center">姓名</td>
<td >電話</td>
</tr>
</table>
<a href="javascript:window.location.reload()">重新整理</a>
</body>
HtmlActivity.java
private WebView webView;
private Handler handler = new Handler();// 異步使用
setContentView(R.layout.htmlui);
webView = (WebView) this.findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);// 允許JavaScript
webView.getSettings().setSaveFormData(false);
webView.getSettings().setSavePassword(false);
webView.getSettings().setSupportZoom(false);// 不準改變大小
webView.addJavascriptInterface(new CactusJavaScript(this, handler),
"cactus");// addJavascriptInterface方法中要綁定的Java對象
webView.setWebChromeClient(new CactusWebClient());
webView.loadUrl("file:///android_asset/index.html");
private final class CactusWebClient extends WebChromeClient {
// WebView上alert是彈不出來東西的,需要定制你的WebChromeClient處理彈出
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
new AlertDialog.Builder(HtmlActivity.this)
.setTitle("提示資訊")
.setMessage(message)
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialoginterface, int i) {
}
}).show();
return true;
CactusJavaScript.java
private Context context;
private WebView webView;
private Handler handler;
public CactusJavaScript(Context context, Handler handler) {
super();
this.context = context;
this.webView = (WebView) ((Activity)context).findViewById(R.id.webview);
this.handler = handler ;
public void personlist() {
handler.post(new Runnable() {// Handler與調用者處于同一線程,如果Handler裡面做耗時的動作,調用者線程會阻塞
webView.loadUrl("javascript:show('" + getPersonJson()
+ "')");
public void call(final String phone) {
handler.post(new Runnable() {
context.startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
+ phone)));
public String getPersonJson() {// 生成json字元串
try {
List<Person> persons=getContacts();
JSONArray jsonArray=new JSONArray();
for (Person person : persons) {
JSONObject jsonObject=new JSONObject();
jsonObject.put("id", person.getId());
jsonObject.put("name", person.getName());
jsonObject.put("mobile", person.getMobile());
jsonArray.put(jsonObject);
return jsonArray.toString();
} catch (JSONException e) {
e.printStackTrace();
return "";
public List<Person> getContacts(){
List<Person> persons = new ArrayList<Person>();
persons.add(new Person(78, "張飛", "1384949494"));
persons.add(new Person(12, "李靜", "194505555"));
persons.add(new Person(89, "趙薇", "1785959595"));
return persons;
下載下傳次數: 19
<a href="http://justsee.iteye.com/blog/985962">檢視圖檔附件</a>