AndroidManifest
活動注冊禀酱, 所有活動都需要在該文件中進行注冊之后才能生效。
活動的生命周期
- onCreate()
活動第一次被創(chuàng)建的時候調(diào)用牧嫉,這個方法中完成活動如加載布局剂跟、綁定事件的初始化操作。 - onStart()
活動變得可見時被調(diào)用 - onResume()
活動準備好和用戶進行交互的時候調(diào)用酣藻。 - onPause()
系統(tǒng)準備去啟動或者回復(fù)另一個活動的時候調(diào)用 - onStop()
- onDestroy()
- onRestart()
特殊類
Calendar
View
Paint
Canvas
數(shù)據(jù)
持久化操作
組件收錄
View類是用戶組件的共同父類曹洽,幾乎所有用戶界面組件都是繼承View類實現(xiàn)。
'android:backgroup':設(shè)置背景顏色辽剧;
'setBackgroudColor()':對應(yīng)方法送淆;
'android:id':為組件設(shè)置可通過findViewById方法獲取的標識符;
'setId()':對應(yīng)方法怕轿;
'findViewById()':對應(yīng)方法偷崩;
'android:alpha':設(shè)置透明度,取值為0~1撞羽;
'setAlpha()':對應(yīng)方法阐斜;
'android:visibility':
控制組件的可見熟悉,可選visible(可見)放吩、invisible(不可見智听,仍然占據(jù)原來的位置與空間)、gone(表示組件不僅不可見渡紫,而且不再占用任何屏幕空間)到推;
'setVisibility()':
通過代碼通過傳入View.VISIBLE/INVISIBLE/GONE控制控件的可見性;
’getVisibility()':
獲取當(dāng)前可見性惕澎;
'android:clickable':設(shè)置組件是否響應(yīng)單擊事件莉测;
TextView
'android:text':指定TextView中顯示的文本內(nèi)容;
’android:gravity‘:來指定文字的對齊方式唧喉,可選top捣卤、bottom忍抽、left、right董朝、center等鸠项,通過’|‘來同時指定多個值表‘且’;
'android:textSIze':文字大凶咏祟绊;
'android:textColor’:文字顏色;
Button
該組件可控制的屬性與TextView差不多哥捕。系統(tǒng)會對Button中的文字自動進行大寫轉(zhuǎn)換牧抽。
'android:textAllCaps':選擇‘false’禁止大寫轉(zhuǎn)換;
‘setOnClickListener’:傳入一個實現(xiàn)了onClick()方法的對象遥赚;
EditText
允許在組件中輸入和編輯內(nèi)容扬舒,并可以在程序中對這些內(nèi)容進行處理。
'android:editable':為ture時凫佛,設(shè)置可編輯讲坎;
'android:numeric':只能輸入數(shù)字,interger(輸入數(shù)值)/signed(輸入帶符號的數(shù)值)/decimal(輸入帶小數(shù)點的數(shù)值)
'android:password':為true時御蒲,密碼輸入字符顯示為原點衣赶;
'android:phoneNumber':為true時,只能輸入電話號碼厚满;
‘a(chǎn)ndroid:hint':指定提示性文本;
'android:maxLines':規(guī)定編輯框可顯示內(nèi)容的最大行數(shù)碧磅,超出后會滾動碘箍;
’getText()‘:獲取EditText組件中輸入的內(nèi)容,不過需要通過調(diào)用toString()轉(zhuǎn)換成字符串鲸郊;
ImageView
該組件需要的圖片一般放在‘drawable'目錄中丰榴,不過該目錄未指定具體的分辨率,可以新建后綴為’-xhdpi‘的文件將圖片放于其中秆撮。
可操作的空間
‘a(chǎn)ndroid:src’:為當(dāng)前ImageView直接指定一張圖片四濒;
’setImageResource()‘:代碼動態(tài)更改ImageView中圖片的方法;
ProgressBar
‘a(chǎn)ndroid:max’:給進度條設(shè)置一個最大值职辨;
'get/setProgress()':獲取/設(shè)置當(dāng)前進度條進度盗蟆;
SeekBar
拖動條,允許用戶拖動滑塊改變值舒裤。該組件可以通過‘a(chǎn)ndroid:thumb’屬性實現(xiàn)喳资,該屬性的值為一個Drawable對象,該對象將作為自定義滑塊腾供。
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
@Override
public void onStopTrackingTouch(SeekBar seekBar){
//結(jié)束滑動時候應(yīng)運行邏輯
}
@Override
public void onStartTrackingTouch(SeekBar seekBar){
//開始滑動時候應(yīng)運行邏輯
}
@Override
public void onProgressChanged(SeekBar seekBar,int progress,boolean fromUser){
//當(dāng)前進度條的值應(yīng)運行的邏輯
}
ListView
listview用于展示大量數(shù)據(jù)仆邓,允許通過手指上下滑動的方式將屏幕外的數(shù)據(jù)滾到屏幕內(nèi)鲜滩。
一般數(shù)組中的數(shù)據(jù)無法直接傳遞給ListView,需要借助適配器完成节值,Android里面有大量的適配器的實現(xiàn)類徙硅,適配器的任務(wù)便是生成ListView中的一個個View子項目。所以適配器在這一刻的主要工作便是將回調(diào)函數(shù)getView()具體實現(xiàn)搞疗,在該回調(diào)方法中將對象中存儲的數(shù)據(jù)一項一項的傳遞給子項目布局的各個組件當(dāng)中闷游。各個適配器中較為常用的為ArrayAdapter,可以用泛型來指定要適配的數(shù)據(jù)類型贴汪,然后在構(gòu)造函數(shù)當(dāng)中將數(shù)據(jù)傳入脐往。
其次與ListView相關(guān)的運用還有ListView的子項目的點擊事件。(果然扳埂,业簿,記太多都會忘,還是看官方備注實在)
/* 該接口的實現(xiàn)在ListView中的子項目被點擊時候回調(diào)*/
public interface OnItemClickListener {
/**
* 如果需要訪問與所該子項目關(guān)聯(lián)的數(shù)據(jù)阳懂,可以通過調(diào)用getItemAtPosition(position)獲取
* @param parent:該點擊事件對應(yīng)的AdapterView適配器對象梅尤。
* @param view:被單擊的AdapterView中的子視圖(由適配器提供的視圖)
* @param position:子視圖在適配器中的位置。
* @param id:被單擊項目的行id岩调。
*/
void onItemClick(AdapterView<?> parent, View view, int position, long id);
}
ArrayAdapter適配器
以ArrayAdapter適配器舉例巷燥,ArrayAdapter的構(gòu)造函數(shù)中需要依次傳入當(dāng)前上下文、ListView子項布局的id号枕、以及所適配的數(shù)據(jù)缰揪,最后調(diào)用ListView的setAdapter()方法,將構(gòu)建好的適配器對象傳遞進去葱淳,將ListView與數(shù)據(jù)聯(lián)系起來钝腺。
適配器需要定義一用于傳遞數(shù)據(jù)的適配類。
適配器的構(gòu)造函數(shù)用于將上下文赞厕,子項布局的id和數(shù)據(jù)傳遞進來艳狐。
適配器需要重寫getView(),該方法在每個子項被滾到屏幕內(nèi)時被調(diào)用皿桑,在方法中首先需要得到當(dāng)前項的實例毫目,然后使用LayoutInflater來為這個子項加載需要傳入的布局。
public class AdapterClass{
//* 定義域诲侮、構(gòu)造函數(shù)镀虐、基本getter、setter方法*//
}
public class MyAdapter extends ArrayAdapter<AdapterClass>{
//*定義額外需要的域*//
public MyAdapter(Context context,int textViewResourceId,List<AdapterClass> objects){//textViewResourceId為子項布局id
super(context,textViewResourceId,objects);
//*初始化自己的域*//
}
@Override
public View getView(int positon,View convertView,ViewGroup parent){//該方法為ArrayAdapter的方法浆西,其中position參數(shù)為實例在數(shù)組中的位置,convertView為上下文布局()
AdapterClass theObject = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(子項布局id,parent,false);//參數(shù)false表示只讓我們在父布局中聲明的layout屬性生效粉私,但不會為這個View添加父布局,因為一旦有了父布局近零,就不能再添加到ListView組件當(dāng)中诺核。
//*獲取組件抄肖,并用適當(dāng)方法向組件中添加適配類中的數(shù)據(jù)*//
return view;
}
}
public class MainActivity extends AppCompatActivity{
//*域*//
@Override
protected void onCreate(Bundle savedInstanceState){
//*其它操作*//
MyAdapter myAdapter = new MyAdapter(MainActivity.this,R.layout.*,adpterClassList);//此處第三個參數(shù)為其它地方已經(jīng)實例化了的ArrayList對象
//當(dāng)需要傳入的布局足夠簡單的時候可以調(diào)用庫中的已有布局,比如'android.R.layout.simple_list_item_1'便是一個簡單的TextView布局窖杀,適用于單純的字符串漓摩。
ListView listView = (ListView) findViewById(R.id.*);
listView.setAdapter(myAdapter);
}
}
//
private class MyAdapter extends BaseAdapter {
// 其它方法或域
@Override
public View getView(int position, View convertView, ViewGroup container) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.list_item, container, false);
}
((TextView) convertView.findViewById(android.R.id.text1))
.setText(getItem(position));
reoturn convertView;
}
}
TimePicker
DatePicker
概念收錄
運行時權(quán)限
運行時權(quán)限功能在6.0之后啟用,首先運用的權(quán)限調(diào)用聲明在AndroidManifest.xml文件中入客。
所有權(quán)限中只有危險權(quán)限和特殊權(quán)限需要在運行時申請管毙,其它普通權(quán)限由系統(tǒng)自動授權(quán)。危險權(quán)限常常為會觸及用戶隱私或者對設(shè)備安全造成影響的桌硫。
危險權(quán)限一共有九組夭咬,24個權(quán)限。危險權(quán)限的授權(quán)按組進行铆隘,同一組的權(quán)限申請成功一個卓舵,則同組其它也獲權(quán)成功。
權(quán)限聲明語法:
//Android Manifest.xml中
<uses-permission android:name="android.permission.*"/>
/*危險權(quán)限除了聲明之外膀钠,6.0以上的系統(tǒng)還需要在代碼中添
加運行時權(quán)限處理掏湾,處理的內(nèi)容主要為:由用戶授權(quán)我們?nèi)?執(zhí)行某些危險操作。*/
//運行時權(quán)限聲明
/*判斷用戶是不是已經(jīng)給過授權(quán)的方法*/
ContextCompat.checkSelfPermission(*Activity.this,Manifest.permission.*)==PackageManager.PERMISSION_GRANTED
/*申請授權(quán)*/
//傳入一個需要申請權(quán)限的數(shù)值肿嘲,以及請求碼融击,供回調(diào)函數(shù)(下面重寫的那個)處理。處理結(jié)果封裝在grantResults中
ActivityCompat.requestPermissions(*Activity.this,new String[] {Manifers.permission.*,...},requestCode)
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
switch(requestCode){
if(grantResults.length>0&&grantResults[0]==PackageManager.*)
//*
else
//*
}
}
}
應(yīng)用收錄
選項菜單
首先在資源目錄中新建menu包雳窟,在其中新建一個main.xml文件尊浪,用于繪制菜單
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/main_item"
android:title="@string/menu_title4"
/>
<!--依次添加菜單項-->
</menu>
接著在需要展示選項菜單的活動中重寫兩個重要方法
public boolean onCreateOptionsMenu(Menu menu){
//首先獲取MenuInflater對象,然后通過inflate給當(dāng)前活動創(chuàng)建菜單涩拙,語法大意為根據(jù)R.main.menu處的資源文件制定菜單际长,并將菜單項添加到menu對象中
getMenuInflater().inflate(R.menu.*,menu);
return turn;
}
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
/*編寫各個選項被選中后應(yīng)該執(zhí)行的操作*/
}
}
上下文菜單
上下文菜單類似于計算機上的右鍵菜單,該菜單與選項菜單不同的地方在于該菜單是長按某一項目時候調(diào)出兴泥,出現(xiàn)于上下文。
//*繪制上下文菜單虾宇,添加菜單項與菜單標題等*//
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo){
}
//*處理菜單點擊事件*//
public boolean onContextItemSelected(MenuItem item){
}
//*在onCreate方法中調(diào)用registerForContextMenu方法搓彻,為視圖注冊上下文菜單
registerForContextMenu(<? extends View>);
對話框
- 首先如果有需要,可以繪制對話框的布局嘱朽,按照正常文件的編寫方法進行編寫即可旭贬。若只是提示框可以不需要進行布局文件的編寫
- 其次將對話框?qū)ο髮嵗ㄟ^調(diào)用方法對對話框進行設(shè)置
AlertDialog.Builder dialog = new AlertDialog.Builder(<? extends context>)
/*設(shè)置各個屬性*/
/*
setTitile();
setMessage();
setPositiveButton();:設(shè)置類似于確定的積極按鍵搪泳,并傳入點擊事件的對象
setNegativeButton();:設(shè)置類似于取消的消極按鍵稀轨,并傳入點擊事件的對象
setView();
*/
/*創(chuàng)建并在合適的時候展示對話框*/
dialog.create();
dialog.show();
/*取消、完成對話框*/
Android的MVC設(shè)計模式
將布局文件作為表現(xiàn)層(View)岸军,將Activity的子類作為控制層(Control)奋刽,并新建繼承了View的新類作為業(yè)務(wù)模型層瓦侮。編寫的業(yè)務(wù)模型層中含有其應(yīng)具備的屬性、行為佣谐,并且可以用于布局當(dāng)中肚吏。
繪圖
- 創(chuàng)建一個View的子類,重寫onDraw()系統(tǒng)回調(diào)方法狭魂。
在onDraw()方法當(dāng)中罚攀,運用畫布Canvas對象與繪筆Paint對象繪制所需要的控件,甚至可以為其賦予屬性雌澄。 - 通過invalidate()方法可以在控制層中刷新該自定義控件的狀態(tài)斋泄。
自定義組件
該運用與繪圖中的MVC設(shè)計模式類似,
//自定義組件的類
public class MyLayout extends LinearLayout{
public MyLayout(Context context,AttributeSet attrs){
super(context,attrs);
//在構(gòu)造函數(shù)中需要對標題欄布局進行動態(tài)加載镐牺,如下語句中from()方法可以構(gòu)建出一個LinearLyoutInflater對象炫掐,然后調(diào)用inflate方法可以動態(tài)加載一個布局文件,其中第一個參數(shù)是要加載的布局文件的id任柜,第二參數(shù)為給加載好的布局添加一個父布局
LayoutInflater.from(context).infalte(R.layout.title.,this);
}
}
//
觸摸事件
觸摸事件的核心是OnTouchListener監(jiān)聽接口中監(jiān)聽方法onTouch(View v,MotionEvent event)的實現(xiàn)卒废。
音頻文件播放
android提供MediaPlayer類播放音頻,
視頻文件播放
照相機
取景:利用Surface組件進行取景宙地,然后通過SurfaceHolder.Callback監(jiān)控取景視圖摔认,Callback接口有下面三個方法需要實現(xiàn)。
@Override
public void surfaceCreated(SurfaceHolder holder) {
//用于初始化
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
//當(dāng)景物發(fā)生變化時候觸動
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
//釋放對象時候觸動
}
在需要實現(xiàn)的地方實現(xiàn)如下邏輯
/*SurfaceView監(jiān)聽圖像——常在onCreate()函數(shù)中*/
surfaceView = findViewById(R.id.*);
SurfaceHolder holder = surfaceView.getHolder();
//注冊回調(diào)監(jiān)聽器
holder.addCallback(this);
//設(shè)置SurfaceHolder的類型
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
/*初始化相機——常在surfaceCreated()函數(shù)中*/
//打開系統(tǒng)相機
Camera camera = Camera.open();
//為相機指定一個用來顯示相機預(yù)覽畫面的SurfaceView
camera.setPreviewDisplay(holder);
/*設(shè)置相機取景參數(shù)——常在surfaceChanged()函數(shù)中*/
Camera.Parameters parameters = camera.getParameters();
//相片格式
parameters.setPictureFormat(PixelFormat.JPEG);
//預(yù)覽畫面的大小
parameters.setPreviewSize(320,240);
//設(shè)置圖片分辨率大小
parameters.setPictureSize(320,240);
//將參數(shù)作用于對象
camera.setParameters(parameters);
//開始預(yù)覽
camera.startPreview();
/*拍照*/
/*public final void takePicture(ShutterCallback shutter,PictureCallback raw,PictureCallback postview,PictureCallback jpeg):
/*觸發(fā)異步圖像捕獲宅粥。相機服務(wù)將在圖像捕獲過程中啟動一
系列對應(yīng)用程序的回調(diào)参袱。快門回調(diào)發(fā)生在圖像被捕獲之后秽梅。
這可以用來觸發(fā)一個聲音抹蚀,讓用戶知道圖像已經(jīng)捕獲。原始
圖像回調(diào)發(fā)生在原始圖像數(shù)據(jù)可用的時候(注意:如果沒有可
用的原始圖像回調(diào)緩沖區(qū)或原始圖像回調(diào)緩沖區(qū)不夠大容納
原始圖像企垦,數(shù)據(jù)將為空)环壤。postview回調(diào)發(fā)生在縮放后的,
完全處理后的圖像是可用的(注意:并非所有硬件都支持此功
能)钞诡。jpeg回調(diào)在壓縮圖像可用時發(fā)生郑现。如果應(yīng)用程序不需
要特定的回調(diào),則可以傳遞null而不是回調(diào)方法荧降。
*/
//照相接箫,同時傳入上訴說明中自身所需要的回調(diào)函數(shù)
camera.takePicture(null,null,new jpegCallback());
/*定義回調(diào)函數(shù)進行壓縮照片或其它操作——常作為參數(shù)傳入takePicture()函數(shù)進行回調(diào)*/
//用壓縮相片舉例,重寫Camera.PictureCallback接口中的方法
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//建立圖像對象
Bitmap bitmap = BitmapFactory.decodeByteArray(data,0,data.length);
try{
//建立輸出流對象
BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(path));
//采用壓縮轉(zhuǎn)檔方法
bitmap.compress(Bitmap.CompressFormat.JPEG,80,outStream);
//更新緩沖流
outStream.flush();
outStream.close();
//顯示拍照的圖片(此處省去imageView的聲明朵诫、賦值操作)
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
異常收錄
疑問收錄
- 子項布局id具體為何物:
子項布局id為作為某一組件的子項的布局id(說了個寂寞)辛友,具體表現(xiàn)為R.layout.,其中xml處的文件。 - 安卓的文件怎么訪問剪返,根目錄在哪
參考博客
/*返回文件系統(tǒng)上存儲用openFileOutput創(chuàng)建的文件的目錄
的絕對路徑废累。如果調(diào)用應(yīng)用程序被移動到所采用的存儲設(shè)
備邓梅,返回的路徑可能會隨著時間而改變,因此只應(yīng)該持久化
相對路徑九默。*/
getFilesDir();
/*返回主共享/外部存儲設(shè)備上的目錄的絕對路徑震放,應(yīng)用程序
可以在其中放置它所擁有的持久文件。這些文件是應(yīng)用程序
內(nèi)部的驼修,通常不作為媒體對用戶可見殿遂。*/
getExternalFilesDir("exter_test").getAbsolutePath();
//返回下載/緩存內(nèi)容目錄。
Environment.getDownloadCacheDirectory().getAbsolutePath();
//返回用戶數(shù)據(jù)目錄乙各。
Environment.getDataDirectory().getAbsolutePath()
/*返回主共享/外部存儲目錄墨礁。如果該目錄已被用戶掛載到其
計算機上,或已從設(shè)備中刪除耳峦,或發(fā)生了其他問題恩静,則當(dāng)前
可能無法訪問該目錄《卓溃可以使用getExternalStorageState()
來確定它的當(dāng)前狀態(tài)驶乾。(不要被“外部”這個詞搞糊涂了。這
個目錄可以被更好地理解為媒體/共享存儲循签。它是一個文件
系統(tǒng)级乐,可以保存相對大量的數(shù)據(jù),并在所有應(yīng)用程序之間共
享(不強制執(zhí)行權(quán)限)县匠。傳統(tǒng)上這是SD卡风科,但它也可以實現(xiàn)為
設(shè)備中的內(nèi)置存儲,與受保護的內(nèi)部存儲不同乞旦,并可以作為
計算機上的文件系統(tǒng)安裝贼穆。)*/
Environment.getExternalStorageDirectory().getAbsolutePath();
/*獲取用于放置特定類型文件的頂級共享/外部存儲目錄。這
是用戶通常放置和管理自己的文件的地方兰粉,所以您應(yīng)該小心
您在這里放置的文件故痊,以確保您不會擦除他們的文件或妨礙
他們自己的組織。(這個目錄可能還不存在玖姑,所以在使用它
之前必須確保它存在崖蜜,比如使用File.mkdirs()。)*/
7Environment.getExternalStoragePublicDirectory("pub_test")
執(zhí)行結(jié)果依次為:
getFilesDir = /data/user/0/com.example.lab_5/files
getExternalFilesDir = /storage/emulated/0/Android/data/com.example.lab_5/files/exter_test
getDownloadCacheDirectory = /cache
getDataDirectory = /data
getExternalStorageDirectory = /storage/emulated/0
getExternalStoragePublicDirectory = /storage/emulated/0/pub_test
2021-11-16 16:53:12.342 14592-146
- Android平臺的app為什么不能隨意創(chuàng)建文件夾(本想創(chuàng)建在最容易找到地方客峭,卻被告之沒有權(quán)限)
參考文獻