版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、移動通信軟件編程 Android,Android用戶人機界面,哈爾濱IMTI移動通信學院 講師:王曉鋒,三,Android基本應用程序架構(1),AndroidManifest.xml 示例內容: ,Android基本應用程序架構(2),R.java 示例內容: public final class R public static final class attr public static final class drawable public static final int icon=0 x7f020000; public static final class layout public
2、 static final int main=0 x7f030000; public static final class string public static final int app_name=0 x7f040001; public static final int hello=0 x7f040000; R類中的代碼會根據(jù)工程res目錄中文件內容的變化而自動更新。 res/drawable 中一般存放 圖標、顏色 等文件和常數(shù)。 res/layout 中一般存放 布局文件(.xml文件)。 res/values 中一般存放 字符串、數(shù)組 等常數(shù)。,Android基本應用程序架構(3)
3、,Activity 前端應用 示例內容: import android.app.Activity; import android.os.Bundle; public class Test extends Activity /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); 覆蓋父類的onCreate方法,
4、成為該Activity程序的入口。 setContentView方法設置當前界面的布局。,Android基本應用程序架構(4),布局文件 main.xml 示例內容: Android中的幾種布局:AbsoluteLayout FrameLayout LinearLayout RelativeLayout TableLayout 布局文件中為組件設置屬性:android:屬性名=屬性值 為組件定義id:+id/id名稱 使用資源:資源/資源名稱 可參照R類使用 代碼中獲取組件對象 如:TextView tv = (TextView)findViewById(R.id.tv1);,drawable
5、自定義顏色常數(shù),在res/values/ 下 新建color.xml(可以隨意取名) 其xml格式與strings.xml是一樣的。 其內容如下: #808080 #FFFFFF #0000FF #000000 注意:resources 和 drawable color 等標簽名稱不可更改。 getResources().getColor(R.color.black); getResources().getDrawable(R.drawable.blue); 另外,Android預定義一些顏色常數(shù),參見Color類。,Style樣式的定義,在res/values/下創(chuàng)建style.xml(注:
6、此文件名可更改) 增加內容如下: 18sp #EC9237 在布局文件中,使用style屬性指定,如: style=style/s1,android.R,該類是Android提供的資源類,同工程中的R類。,Activity(1),onCreate程序入口 setContentView(layoutResID)設置界面布局 setContentView(view)設置View組件為整個界面 findViewById按id獲取布局中的視圖組件對象 getBaseContext()獲取基本的上下文對象 getResources()獲取資源對象 getResources()獲取資源對象(也可調用Con
7、text對象的該方法) getWindowManager()獲取窗口管理者 getDefaultDisplay()獲取默認的顯示對象 getHeight()屏幕高 getWidth()屏幕寬 getMetrics(displayMetrics) 也可用此方法獲取顯示的一些信息(如屏幕高度 寬度) startActivity(intent)啟動一個新的Activity finish()關閉(銷毀)此Activity setIntent(newIntent) getIntent() onActivityResult(int requestCode, int resultCode, Intent d
8、ata) 如要獲取后一個Activity返回的數(shù)據(jù),則覆蓋此方法。 setResult(resultCode) 設置返回信息(為前一個Activity), resultCode在Activity中有常量,以RESULT_開頭 setResult(resultCode, data)data為Intent對象 getAssets()獲取AssetManager,Activity(2),onCreateOptionsMenu(Menu menu)創(chuàng)建選項菜單時,該方法被調用 onOptionsItemSelected(MenuItem item) 當菜單項被選擇時,該方法被調用 Applicatio
9、n getApplication()獲取應用程序對象,Menu,add(title) 添加菜單項 add(titleRes) add(groupId, itemId, order, title) add(groupId, itemId, order, titleRes) removeGroup(groupId)移除菜單組 removeItem(id)移除菜單項 findItem(id)查找菜單項 size()菜單項總數(shù) getItem(index)獲取菜單項 setGroupVisible(group, visible)設置菜單組可見狀態(tài) setGroupEnabled(group, enab
10、led)設置菜單組可用狀態(tài) setGroupCheckable(group, checkable, exclusive)設置菜單組選中狀態(tài) hasVisibleItems()是否有顯示的菜單項,MenuItem,getGroupId()獲取組id getItemId();獲取菜單項id getOrder()獲取排序id getSubMenu()獲取子菜單 getTitle()獲取標題 setIcon(icon)設置圖標 hasSubMenu() 是否有子菜單 isCheckable() 是否可選 isChecked() 是否選中 isEnabled() 是否可用 isVisible() 是否可
11、見 setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener menuItemClickListener)添加菜單項點擊事件,Intent,Intent() Intent(CharSequence) Intent(CharSequence, Uri) Intent(Context, Class) setClass從哪個Activity對象跳到哪個Activity class 例:intent.setClass(ATest.this, com.wxf.lesson.BTest.class); putExtra(name, value)
12、放置各種基本類型數(shù)據(jù) intent.putExtras(extras)放置Intent和Bundle類型數(shù)據(jù),Bundle,Bundle() bundle.putString(key, value)放置數(shù)據(jù) bundle.putDouble(key, value) bundle.putStringArray(key, value) bundle.putStringArrayList(key, value) .,TextView,setText()設置文本 setTextSize()字體大小 setTypeface(Typeface.SANS_SERIF,Typeface.BOLD)字體樣式 s
13、etTypeface(Typeface.createFromAsset(getAssets(),fonts/vrinda.ttf) 使用外部字體文件改變字體 setTextColor()設置文本顏色 append()添加文本 getCurrentTextColor()獲取當前文字顏色 getHeight()獲取TextView高度 getId()獲取id getText()獲取文本 length()獲取文本長度 getWidth()獲取View寬度 hasFocus()設置焦點 isClickable()是否可點擊 isEnabled()是否可用 isFocusable()是否可以獲得焦點 i
14、sFocused()是否焦點 setBackgroundColor(color)設置背景顏色,Button,setOnClickListener設置點擊事件 setOnFocusChangeListener(OnFocusChangeListener)焦點改變事件 = ImageButton圖片按鈕 setImageDrawable(drawable)設置圖片 setImageResource(resId) 如想在layout中直接為按鈕設置圖片,只需使用如下屬性: android:src=drawable/xxx,Dialog,Dialog(Context context) 構造方法 voi
15、d setTitle(int titleId) 設置標題 void setContentView(View view) 設置上下文視圖布局 Window getWindow() 獲取窗口對象 void setContentView(int layoutResID) void show() 顯示 void dismiss() 銷毀窗口 void cancel() 取消窗口 小花樣:創(chuàng)建背景模糊的對話框: Window w = dialog.getWindow(); w.setFlags ( WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowMa
16、nager.LayoutParams.FLAG_BLUR_BEHIND );,AlertDialog.Builder,Builder是AlertDialog的public static 內部類。 Builder(activity)構造方法 setTitle(arg0)設置標題 setMessage(arg0)設置消息 setIcon(Drawable)設置圖標 setView(View v)設置視圖布局 setIcon(int) setItems(CharSequence, DialogInterface.OnClickListener) 可選擇的對話框(不能和setMessage共用) sh
17、ow()顯示 setPositiveButton(charSequence, onClickListener)添加確定按鈕 setNegativeButton(charSequence, onClickListener)添加否定按鈕 setNeutralButton(charSequence, onClickListener)添加中立按鈕 把用戶點擊完按鈕要做的工作放到OnClickListener中實現(xiàn)。,自定義AlertDialog.Builder視圖,LayoutInflater inflater = LayoutInflater.from(Test.this); View view =
18、 inflater.inflate(R.layout.dialog, null); Builder b = new Builder(Test.this); b.setTitle(提示); b.setMessage(請輸入你的姓名:); b.setView(view); dialog.xml內容如下: 運行后效果是:在Dialog上會有一個EditText。,ProgressDialog,ProgressDialog(Context context) 構造方法 void show()顯示 void setMessage(CharSequence message) 設置消息 void setTit
19、le(CharSequence title)設置標題 static ProgressDialog show(Context context, CharSequence title, CharSequence message) 顯示 static ProgressDialog show(.) void setMax(int max) 設置最大值 void setProgress(int value) 設置進度(只能在線程中設置?) void setProgressDrawable(Drawable d) 設置顏色 void getMax()獲取最大值 int getProgress()獲取當前進
20、度值 void dismiss()銷毀窗口 void cancel()同dismiss,調用該方法將會調用OnCancelListener中的onCancel方法。而dismiss則不會調用。 setProgressStyle設置進度條樣式(默認為ProgressDialog.STYLE_SPINNER) 調置為ProgressDialog.STYLE_HORIZONTAL時會顯示進度。,EditText,setOnKeyListener(View.OnKeyListener)添加按鍵監(jiān)聽事件 setOnClickListener(View.OnClickListener)點擊事件 Edita
21、ble getText()獲取文本 setText(CharSequence)設置文本 setText(resid) = Editable 抽象接口 String toString()得到Editable中的字符串,Toast 小提示,public static final int LENGTH_LONG 持續(xù)時間長 public static final int LENGTH_SHORT 持續(xù)時間短 Toast static Toast makeText(Context context, int resId, int duration) Toast static Toast makeText
22、(Context context, CharSequence text, int duration) void show() 顯示,CheckBox,isChecked()是否選中 setChecked(checked)設置選中狀態(tài) setOnCheckedChangeListener(OnCheckedChangeListener) 選中狀態(tài)改變監(jiān)聽器 setOnTouchListener(OnTouchListener)屏幕觸控事件,RadioGroup,setOnCheckedChangeListener(RadioGroup.OnCheckedChangeListener) 單選組選擇
23、改變事件監(jiān)聽 clearCheck()清除單選組的選中狀態(tài) = RadioButton單選按鈕 isChecked()是否被選中 setChecked(checked)設置選中狀態(tài) getId()獲取resId,ImageView,void setImageDrawable(Drawable drawable) 設置圖片 void setImageBitmap(bm)設置圖片 setOnClickListener(View.OnClickListener)設置點擊事件監(jiān)聽 setAlpha(int alpha)設置透明度(0-255),255為不透明 另外注意:setAlpha方法針對的是【圖
24、片資源】,即,如果兩個ImageView對象顯示的是同一個圖片資源,如果設置其中一個ImageView對象的透明度,則另外一個會有相同效果。,Spinner 下拉菜單(1),setOnItemSelectedListener(OnItemSelectedListener)菜單項選擇事件 void setAdapter(SpinnerAdapter adapter) 設置Adapter void setSelection(int position) 設置選中項 int getCount ()獲取菜單項總數(shù) Object getSelectedItem()獲取選中項 Int getSelected
25、ItemPosition()獲取選中項的索引 使用舉例: Spinner s = (Spinner)findViewById(R.id.Spinner01); String ss = getResources().getStringArray(R.array.ss); ArrayAdapter aa = new ArrayAdapter( this, android.R.layout.simple_spinner_dropdown_item, ss); s.setAdapter(aa);,Spinner 下拉菜單(2),使用舉例: 可用List替代String,以便能動態(tài)的修改Spinner中
26、的菜單項。 Spinner sp = (Spinner)findViewById(R.id.Spinner01); ArrayList al = new ArrayList(); al.add(abc); al.add(bcd); ArrayAdapter aa = new ArrayAdapter( this, android.R.layout.simple_spinner_dropdown_item, al); aa.add(xyz); sp.setSelection(aa.getPosition(xyz);,ArrayAdapter,數(shù)組適配器類,適用于顯示列表的視圖組件。 常用構造方法
27、: ArrayAdapter(Context context, int textViewResourceId, T objects) ArrayAdapter(Context context, int textViewResourceId, List objects) int getCount()獲取數(shù)據(jù)總數(shù) 關于 textViewResourceId: 應該為這個參數(shù),提供一個布局,如R.layout.xxx,我們也可以用Android現(xiàn)有的,如android.R.layout.xxx 該布局文件中,應包含一個TextView組件,示例如下: 注意:該Layout可以沒有布局(如Linear
28、Layout),只有一個TextView,但它必須包含屬性:xmlns:android,這個屬性的值和自動生成布局Layout的xmlns:android參數(shù)值是相同的。,手機文件搜索,java.io.File 類 File f = new File(/);/目錄 / 代表手機文件系統(tǒng)的根目錄 /* 其余內容請參見File類相關API */,AutoCompleteTextView,setAdapter(adapter) setOnItemClickListener(AdapterView.OnItemClickListener) = MultiAutoCompleteTextView 類 輸
29、入文字會自動提示,用,分隔時會再次出現(xiàn)提示。 setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer() 注:由于AutoCompleteTextView也是使用Adapter,所以也支持動態(tài)更新列表值。,時鐘顯示組件,AnalogClock圖形時鐘 DigitalClock數(shù)字時鐘 這兩個時鐘組件,只做觀賞用。_ 獲取系統(tǒng)時間 : System.currentTimeMillis() Calendar c = new GregorianCalendar() c.get(Calendar.HOUR_OF_DAY) c.get(Cale
30、ndar.MINUTE),Handler和Message,final MultiAutoCompleteTextView ma = (MultiAutoCompleteTextView) findViewById(R.id.MultiAutoCompleteTextView01); /繼承Handler,覆蓋handleMessage方法,以接收該handler的消息 Handler handler = new Handler() Override public void handleMessage(Message msg) switch (msg.what) /根據(jù)不同消息類型做不同處理 c
31、ase 0 x1981: ma.setText(收到消息!); break; ; /*可以在任意位置向handler發(fā)送消息*/ Message m = new Message();/創(chuàng)建消息對象 m.what = 0 x1981;/指定消息類型 handler.sendMessage(m);/向handler發(fā)送消息,DatePicker,void init(int year, int monthOfYear, int dayOfMonth, DatePicker.OnDateChangedListener onDateChangedListener) 初始化日期 int getYear()
32、 得到年份 int getMonth() 得到月份 int getDayOfMonth() 得到日數(shù) void setEnabled(boolean enabled) 設置是否可用 void updateDate(int year, int monthOfYear, int dayOfMonth) 更新日期,TimePicker,Integer getCurrentHour() 獲取當前小時 Integer getCurrentMinute() 獲取當前分鐘 void setIs24HourView(Boolean is24HourView) 設置是否24小時制 void setOnTimeC
33、hangedListener(TimePicker.OnTimeChangedListener onTimeChangedListener) 設置時間改變監(jiān)聽 void setEnabled(boolean enabled) 設置是否可用,日期時間選擇對話框,DatePickerDialog 日期選擇對話框 DatePickerDialog(Context context, DatePickerDialog.OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) 構造方法 void show() 顯示對話框
34、void updateDate(int year, int monthOfYear, int dayOfMonth) 更新日期 = TimePickerDialog 時間選擇對話框 TimePickerDialog(Context context, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) 構造方法 void updateTime(int hourOfDay, int minutOfHour) 更新時間 void show() 顯示對話框,Progr
35、essBar,和ProgressDialog不同的是,ProgressBar是以組件的形式存在在Layout中的,而ProgressDialog是以對話框(Dialog)的形式出現(xiàn)的。 一般的,想顯示ProgressBar的時候,設置其顯示,否則將其隱藏。 在Layout中將ProgressBar設置隱藏的屬性是 android:visibility=gone 上面的gone是View類的靜態(tài)常量,代表不在界面顯示,而View.VISIBLE 代表顯示。 如想讓ProgressBar顯示橫向進度樣式,只需在layout中為ProgressBar加上如下屬性: style=?android:at
36、tr/progressBarStyleHorizontal 其它方法參見ProgressDialog,GridView,void setNumColumns(int numColumns) 設置列數(shù) void setAdapter(ListAdapter adapter) 設置Adapter void setSelection(int position) 設置選中位置 void refreshDrawableState()刷新顯示狀態(tài),ListView 列表組件,setAdapter(adapter) setChoiceMode()設置選擇模式 setOnItemSelectedListene
37、r(listener) setOnItemClickListener(listener) 可用android默認布局: android.R.layout.simple_list_item_1基本文本 android.R.layout.simple_list_item_single_choice單選按鈕 android.R.layout.simple_list_item_checked復選按鈕 android.R.layout.simple_list_item_multiple_choice多選按鈕 更可使用自定義的布局。 如想要ListView支持多選,則應設置 setChoiceMode(L
38、istView.CHOICE_MODE_MULTIPLE),ListActivity,ListActivity本身就是一個列表組件,所以不需要使用setContentView來指定布局。ListActivity本身布局即鋪滿手機屏幕。 另外注意,列表操作(如setListAdapter)時,不能在【構造方法】中進行,否則Android會報錯。 setListAdapter(adapter) ListActivity默認是一個ListView鋪滿整個屏幕,也可以在ListActivity的onCreate方法中使用setContentView來指定布局,雖然不是必須的,但如果要自定義ListAc
39、tivity布局的話,必須要這么做。 特別注意:在自定義的Layout布局中,必須包含一個ListView,且android:id=android:id/list,否則android會報錯。,BitmapFactory,BitmapFactory.decodeFile(pathName)將手機中的圖片轉換為Bitmap格式 pathName例:/data/data/irdc/test.png“ decodeResource(res, id)轉換資源文件中的圖片 例:BitmapFactory.decodeResource(getResources(), R.drawable.icon); de
40、codeStream(is)轉換流中的圖片,Bitmap,getHeight() getWidth(),Linkify 鏈接規(guī)則,可以為文本組件TextView和Spannable添加鏈接規(guī)則 Linkify.addLinks(tv, Linkify.EMAIL_ADDRESSES|Linkify.PHONE_NUMBERS|Linkify.WEB_URLS); 那么,組件在顯示相應規(guī)則文本(email、電話號碼、http鏈接)時,會顯示鏈接,用戶點擊后,會啟動對應的程序。 注意,上面的代碼必須在組件創(chuàng)建完成之后才生效。也就是不要直接寫在onCreate方法中,可寫在其它方法或事件中。 但有一
41、種更好的方法來替代上面的代碼,即可以在布局文件中,設置文本組件的autoLink屬性以達到相同效果,如下: android:autoLink=web|phone|email 或 android:autoLink=all,SimpleAdapter,SimpleAdapter(Context context, List data, int resource, String from, int to) Constructor 構造方法參數(shù)說明: 0:Content 1:List 2:布局 3:顯示的內容【以Map中的key表示】 4:顯示內容所使用的組件【以int表示,該數(shù)組中應包含 布局中的 T
42、extView 組件id】,自定義Adapter,有時,需要在列表中顯示更為復雜的界面(如大于2項的數(shù)據(jù),或顯示圖片等),這時就應該擴展BaseAdapter類來自定義適用于我們自己的Adapter。 1、繼承BaseAdapter 2、構造方法(不是必要,但建議添加)中應包含Context參數(shù)以獲取Activity上下文對象,另外還需要根據(jù)情況接收一些集合類型(如List)的數(shù)據(jù)(個數(shù)根據(jù)實際情況確定)。 另外,建議在構造方法通過Context對象獲取LayoutInflater對象,該對象用于從指定layout中獲取View對象。 獲取方法:LayoutInflater mInflater
43、 = LayoutInflater.from(context) 3、覆蓋BaseAdapter的抽象方法,如getCount()、getItem(int)、getItemId(int)等。 4、創(chuàng)建ViewHolder類,該類中應包含視圖組件屬性,如TextView或ImageView等。用以封裝多個視圖組件給列表視圖顯示。 5、getView(int position,View convertView,ViewGroup par)方法的實現(xiàn): 該方法的功能是將數(shù)據(jù)顯示到視圖中。 本方法主要是為convertView的tag中的ViewHolder中的組件賦值。 可通過convertView的
44、getTag()方法獲取ViewHolder(手動強轉)。 但有時convertView對象為null 即無法調用getTag()方法獲取ViewHolder對象,則此時應該獲取convertView對象,方法如下: convertView = mInflater.inflate(R.layout.file_row, null); 其中R.layout.file_row為【列表項布局】,手動創(chuàng)建ViewHolder對象,再通過convertView的findViewById方法可獲取該布局中的View對象,將每個View對象賦值給ViewHolder的相應View變量。 最后,將數(shù)據(jù)設置到Vi
45、ewHolder中的組件,返回convertView即可。,ExpandableListActivity,和ListActivity類似,用來展示可伸縮的列表。它也有個默認的布局,該布局中包含一個ExpandableListView 組件,該組件id=id/android:list 綁定數(shù)據(jù): void setListAdapter(ExpandableListAdapter adapter) 可使用的Adapter有:SimpleExpandableListAdapter 和 SimpleCursorTreeAdapter,TabActivity(1),配合TabHost和TabSpec可顯
46、示選項卡組件 布局文件: (TabActivity示例布局文件是 tab_content.xml ) ,TabActivity(2),關于布局中的組件: TabHost 選項卡組件,可以和其它組件一起使用。 TabWidget 即用戶可選擇的選項卡 FrameLayout 中放置每個選項卡顯示的組件,可以是其它布局。 Java代碼: setContentView(R.layout.main);/設置布局 TabHost th = getTabHost();/獲取TabHost對象 TabSpec ts = null; ts = th.newTabSpec(顯示設置tag);/為TabHost創(chuàng)
47、建新選項卡 參數(shù)可為 ts.setIndicator(顯示設置);/為選擇卡設置文文 ts.setContent(R.id.EditText01);/設置該選項卡被選中后顯示的視圖組件 th.addTab(ts); ts = th.newTabSpec(系統(tǒng)設置tag); ts.setIndicator(系統(tǒng)設置); ts.setContent(R.id.EditText02); th.addTab(ts); th.setCurrentTab(1);/按index設置當前選中的選項卡 / th.setCurrentTabByTag(“系統(tǒng)設置tag”);/按tag設置當前選中的選項卡,PreferenceActivity(1),首選項Activity 布局 preference.xml : Java代碼 : addPreferencesFromResource(R.layout.preference);,PreferenceActivity(2),獲取用戶修改后的PreferenceActivity 首選項配置 方式一:為每個首選項添加狀態(tài)響應事件: protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstan
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農機深松整地制度規(guī)范
- 路燈防臺風管理制度規(guī)范
- 幼兒園洗滌室制度規(guī)范
- 化工更衣管理制度規(guī)范
- 鄉(xiāng)鎮(zhèn)社會聽證制度規(guī)范
- 員工廚房用餐制度規(guī)范
- 足浴接待制度及標準規(guī)范
- 臨建庫房管理制度規(guī)范
- 學校食堂相關規(guī)范制度
- 醫(yī)護人員衣著制度規(guī)范
- 2025年醫(yī)保局支部書記述職報告
- 世說新語課件
- 全體教師大會上副校長講話:點醒了全校200多名教師!毀掉教學質量的不是學生是這7個環(huán)節(jié)
- T-CDLDSA 09-2025 健身龍舞彩帶龍 龍舞華夏推廣套路技術規(guī)范
- GB/T 46561-2025能源管理體系能源管理體系審核及認證機構要求
- GB/T 19566-2025旱地糖料甘蔗高產栽培技術規(guī)程
- 去極端化條例解讀課件
- 水上拋石應急預案
- 蘇州大學介紹
- 酒店消防安全應急預案范本
- 疲勞骨折課件
評論
0/150
提交評論