閱讀本文需要有Java和前端的基礎(chǔ),本文是我學(xué)習(xí)Android時(shí)的筆記。
一、UI開發(fā)
AS快捷鍵
Info | Key |
---|---|
復(fù)制行 |
Ctrl +D
|
刪除行 |
Ctrl +Y
|
注釋 |
Ctrl +/
|
注釋2 |
Ctrl +Shift +/
|
撤銷 |
Ctrl +Z
|
恢復(fù) |
Ctrl +Shift +Z
|
顯示結(jié)構(gòu) |
Ctrl +F12
|
格式化代碼 |
Ctrl +Alt +L
|
打開設(shè)置 |
Ctrl +Alt +S
|
自動補(bǔ)全代碼 |
Ctrl +Shift +Space
|
自動導(dǎo)包 |
Alt +Enter
|
布局
1.線性布局(LinearLayout)
一些重要屬性
//控制子控件的排列方向
orientation="vertical" //垂直
orientation="horizontal" //水平
//設(shè)置權(quán)重(權(quán)重總和為分母,可用于屏幕按鈕的適配)
layout_weight="1"
2.相對布局(RelaviteLayout)
Layout下的控件屬性
:
控件位置 | Info |
---|---|
layout_centerInParent | 位于 父的 正中央 |
layout_centerVertical | 位于 父的 垂直中 |
layout_centerHorizontal | 位于 父的 水平中 |
layout_above | 位于 某的 上 |
layout_below | 位于 某的 下 |
layout_toLeftOf | 位于 某的 左 |
layout_toRightOf | 位于 某的 右 |
layout_alignParentTop | 是否與父 頂 對齊 |
layout_alignParentLeft | 是否與父 左 對齊 |
layout_alignParentRight | 是否與父 右 對齊 |
layout_alignParentBottom | 是否與父 底 對齊 |
layout_alignTop | 與某的 上 對齊 |
layout_alignLeft | 與某的 左 對齊 |
layout_alignRight | 與某的 下 對齊 |
layout_alignBottom | 與某的 右 對齊 |
與前端CSS類似
控件間距(Margin) | 布局內(nèi)邊距(Padding) |
---|---|
layout_marginTop | paddingTop |
layout_marginBottom | paddingBottom |
layout_marginLeft | paddingLeft |
layout_marginRight | paddingRight |
padding |
3.針布局(FrameLayout)
該布局為每個(gè)加入其中的控件創(chuàng)建一個(gè)空白區(qū)域(稱為一幀,每個(gè)控件占據(jù)一幀),所以控件默認(rèn)顯示在左上角,先放的在最底層。
Key | Info |
---|---|
foreground | 設(shè)置容器 的前景圖 |
foregroundGravity | 設(shè)置前景圖顯示位置 |
4.表格布局(TableLayout)
需要和TableRow
標(biāo)簽配合使用,TableRow
的數(shù)量決定表格的行數(shù)。
布局屬性 | Info |
---|---|
stretchColumns | 設(shè)置列可 拉伸 |
shrinkColumns | 設(shè)置列可 收縮 |
collapseColumns | 設(shè)置列可 隱藏 |
控件屬性 | Info |
---|---|
layout_column | 在控件少于單元格的情況下,指定顯示的位置 |
layout_span | 默認(rèn)為1,可指定控件占幾個(gè)單元格 |
5.絕對布局(AbsoluteLayout)
//布局屬性
layout_x = "50dp";
layout_y = "100dp";
常用控件
1.TextView
控件屬性 | Info |
---|---|
text | |
textColor | |
textSize | sp |
textStyle | bold,italic |
gravity | 文本位置 |
layout_width | 控件高 |
layout_height | wrap_content , match_parent |
height | 文本域高( 不常用) |
width | 文本域?qū)挘?不常用) |
maxLength | 文本最大長度 |
phoneNumber | 以電話形式顯示 |
password | 以密碼形式顯示 |
2.EditView
控件屬性 | Info |
---|---|
hint | 提示文本 |
lines | 設(shè)置固定行高 |
maxLines | 最大行數(shù) |
minLines | 最小行數(shù) |
password | 以密碼形式顯示 |
phoneNumber | 以電話形式顯示 |
scrollHorizontally | 水平滾動條 |
capitalize | 首字母大寫 |
editable | 是否可編輯 |
background="@null"屬性為去掉控件默認(rèn)的下劃線
3.Button
點(diǎn)擊事件的兩種實(shí)現(xiàn)方法
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
//onClick方法已經(jīng)棄用了
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"/>
//lambda表達(dá)式
btn1.setOnClickListener(view -> {
btn1.setText("btn1");
});
public void click(View v){
btn2.setText("btn2");
}
按鈕點(diǎn)擊事件較多的情況下,實(shí)現(xiàn)OnClickListener接口,重寫onClick方法:
public class MainActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//TODO 初始化N個(gè)控件...
}
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.btn1:
btn1.setText("btn1");
case R.id.btn2:
btn1.setText("btn2");
//......
}
}
}
4.RadioButton
Radiobutton
需要與 RadioGroup
配合使用
//RadioGroup控件的屬性 控制子控件的排列方向
orientation="vertical" //垂直
orientation="horizontal" //水平
//RadioButtion控件的屬性 設(shè)置按鈕默認(rèn)為選中狀態(tài)
checked="ture"
監(jiān)聽事件(setOnCheckedChangeListener)
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
if(i == R.id.rbtn){
//TODO
}else{
//TODO
}
});
5.ImageView
//background是背景,會根據(jù)控件大小進(jìn)行伸縮
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg"/>
//src是前景,以原圖大小顯示
<ImageButton
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/ic_launcher_background"
android:src="@drawable/ic_launcher_foreground"/>
6.ProgressBar
ProgressBar的屬性
Key | Info |
---|---|
indeterminate | 不確定模式,動畫無限循環(huán) |
indeterminateDrawable | 設(shè)置不確定模式是否可drawable |
max | 進(jìn)度的最大值 |
maxHeight | 進(jìn)度Widget最大高 |
maxWidth | 進(jìn)度Widget最大寬 |
minHeight | 進(jìn)度Widget最小高 |
minWidth | 進(jìn)度Widget最小寬 |
progress | 進(jìn)度默認(rèn)值,0~max |
progressBackgroundTint | 背景顏色 |
secondaryProgress | 定義二級進(jìn)度值,0~max |
ProgressBar的方法
Function | Info |
---|---|
getMax() | 返回最大值 |
getProgress() | 返回進(jìn)度 |
getSecondaryProgressBy() | 返回次要進(jìn)度 |
incrementProgressBy() | 指定增長的進(jìn)度,正數(shù)增加,負(fù)數(shù)減少 |
isIndeterminate() | 是否為不確定模式 |
setLndeterminate() | 設(shè)置為不確定模式 |
系統(tǒng)提供的樣式
style=“@andorid:style/*” | Info |
---|---|
Widget.progressBar.Horizontal | 水平進(jìn)度條 |
Widget.progressBar.Inverse | 普通環(huán)形(默認(rèn)) |
Widget.progressBar.Large | 大環(huán)形 |
Widget.progressBar.Small | 小環(huán)形 |
自定義進(jìn)度條比較復(fù)雜,不展開
另外,對話框形式的進(jìn)度條ProgressDialog
已被棄用,不建議使用。
常見對話框
1.AlertDialog
AlertDialog.Builder dialog = new AlertDialog.Builder(this)
.setTitle("密碼錯(cuò)誤")
.setIcon(R.drawable.ic_launcher_background)
.setPositiveButton("確定",null)
.setNegativeButton("取消",null)
.setMessage("123");
dialog.show();
2.單選(AlertDialog)
new AlertDialog.Builder(this)
.setTitle("選擇性別")
.setSingleChoiceItems(new String[]{"男", "女"}, 0,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
})
.setPositiveButton("確定",null)
.show();
setSingleChoiceItems()方法需要設(shè)置三個(gè)參數(shù):
- 建立數(shù)組,用于顯示選項(xiàng)內(nèi)容
- 參數(shù)是否默認(rèn)選中:0表示選中第一個(gè),-1表示默認(rèn)不選中
- 設(shè)立監(jiān)聽,允許對話框被點(diǎn)擊
3.多選(AlertDialog)
//lambda表達(dá)式
new AlertDialog.Builder(this)
.setTitle("選擇性別")
.setMultiChoiceItems(new String[]{"a", "b", "c", "d", "e", "f"},
new boolean[]{true, true, false, false, true, true},
((dialogInterface, i, b) -> {
}))
.setPositiveButton("確定",null)
.show();
setMultiChoiceItems()方法需要設(shè)置三個(gè)參數(shù):
-
String[]
建立數(shù)組,用于顯示選項(xiàng)內(nèi)容 -
boolean[]
建立數(shù)組,參數(shù)是否默認(rèn)選中 - 設(shè)立監(jiān)聽,允許對話框被點(diǎn)擊(相比單選多了一個(gè)boolean參數(shù))
4.消息對話框(Toast)
//輕量級信息提醒機(jī)制
//別忘了在最后的show方法
Toast.makeText(this,"hello",Toast.LENGTH_SHORT).show();
Toast.makeText(this,"hello",Toast.LENGTH_LONG).show();
5.自定義對話框
新建一個(gè)my_dialog.xml
文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#fff"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#08F"
android:gravity="center"
android:text="自定義對話框"
android:textColor="#fff"
android:textSize="18sp"
android:visibility="visible"/>
<LinearLayout
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<TextView
android:id="@+id/tv_msg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:minHeight="100dp"
android:paddingTop="15dp"
android:paddingRight="20dp"
android:paddingBottom="15dp"
android:paddingLeft="20dp"
android:textColor="#4e5052"
android:textSize="16sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_gravity="bottom"
android:background="#EEE"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/btn_ok"
android:layout_width="114dp"
android:layout_height="40dp"
android:layout_marginLeft="20dp"
android:background="#6200ee"
android:gravity="center"
android:text="確定"
android:textColor="#FFF"
android:textSize="15sp"/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="114dp"
android:layout_height="40dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="#d0d0d0"
android:gravity="center"
android:text="取消"
android:textColor="#666"
android:textSize="15sp"/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
PS:按鈕的顏色改不了,就在values/themes.xml中修改
<style name="Theme.Textbook_test01" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
新建MyDialog.java
文件,繼承Dialog類
public class MyDialog extends Dialog {
private String dialogMessage;
private TextView tvMsg;
private Button btnOK;
private Button btnCancel;
//構(gòu)造方法
public MyDialog(Context context,String dialogMessage){
super(context);
this.dialogMessage = dialogMessage;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去除標(biāo)題
requestWindowFeature(Window.FEATURE_NO_TITLE);
//引入自定義對話框布局
setContentView(R.layout.my_dialog);
tvMsg=findViewById(R.id.tv_msg);
btnOK=findViewById(R.id.btn_ok);
btnCancel=findViewById(R.id.btn_cancel);
//設(shè)置自定義對話框顯示內(nèi)容
tvMsg.setText(dialogMessage);
btnOK.setOnClickListener(view -> {
//TODO 確認(rèn)后的操作
});
btnCancel.setOnClickListener(view -> {
dismiss();//關(guān)閉當(dāng)前對話框
});
}
}
在MainActivity.java中創(chuàng)建對象
new MyDialog(this,"我是自定義的Dialog").show();
樣式和主題
當(dāng)style和theme的屬性發(fā)生沖突時(shí),style的優(yōu)先級要高于theme
1.樣式(styles.xml)
安卓中的樣式類似與網(wǎng)頁中CSS樣式,可以讓設(shè)計(jì)與內(nèi)容分離。
在res/values下新建styles.xml。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="textStyle_one">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#999</item>
<item name="android:textSize">35sp</item>
</style>
<style name="textStyle_two" parent="@style/textStyle_one">
<item name="android:textSize">25sp</item>
</style>
</resources>
其中name屬性是樣式名稱,parent屬性表示繼承某個(gè)樣式
通過標(biāo)簽定義樣式。
在布局文件中引用樣式:
<TextView
android:id="@+id/tv1"
style="@style/textStyle_one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="test樣式1"
tools:ignore="MissingConstraints" />
<TextView
style="@style/textStyle_two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="test樣式2"
app:layout_constraintTop_toBottomOf="@+id/tv1"
tools:ignore="MissingConstraints" />
2.主題(themes.xml)
主題是應(yīng)用到整個(gè)Activity和Application的樣式,要在AndroidManifest.xml
文件中引用。
<!-- themes.xml 自定義的主題 -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryDark">@color/purple_200</item>
<item name="colorAccent">@color/purple_700</item>
</style>
<style name="grayTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:background">#999</item>
</style>
在AndroidManifest.xml
中應(yīng)用主題
<!-- AndroidManifest.xml -->
<activity
android:name=".SelectTraActivity"
android:theme="@style/grayTheme"
android:exported="false" />
注意,在定義主題時(shí),需用到parent屬性去繼承"Theme.AppCompat.Light.DarkActionBar"來保證兼容性。
注意,在java代碼中也可以引用主題,需在onCreate()方法內(nèi)添加.setTheme(R.style.grayTheme)方法,該方法通常放在setContentView()方法之后。
國際化(I18N)
讓不同國家的人看到不同的效果,就需要用到這個(gè)功能。
右鍵 res文件夾
—> New —> Values resource file —>
文件名 string.xml
,Directory name和type 為values —>
選Locale —> 選國家—>選語言—>確定
在對應(yīng)的文件下修改對應(yīng)的資源,就能實(shí)現(xiàn)不同語言下看到不同的效果
程序調(diào)試
androidTest是整合測試??梢源虬鼮閍pk運(yùn)行在設(shè)備上,可以實(shí)時(shí)查看細(xì)節(jié)。
test是單元測試類。運(yùn)行在本地開發(fā)機(jī)上,速度快。
單元測試(test 模塊)
要測試的方法直接寫在test模塊的類里,要加上@Test
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
@Test
public void test() throws Exception{
final int expected =2;
final int reality =2;
//斷言,expected期望的參數(shù)值與reality相同
assertEquals(expected,reality);
}
}
LogCat
Logcat在編輯器的最下面一欄的中間。可以通過限定精確查找。
靜態(tài)方法 | 級別 | Translate |
---|---|---|
Log.v() | Vebose | 詳細(xì)信息(低) |
Log.d() | Debug | 調(diào)試信息 |
Log.i() | Info | 一般信息 |
Log.w() | Warning | 警告信息 |
Log.e() | Error | 錯(cuò)誤信息 |
無 | Assert | 斷言(高) |
Debug
打斷點(diǎn):單擊代碼右側(cè)
功能 | 快捷鍵 | |
---|---|---|
Step Over | 執(zhí)行下一句 | F8 |
Step Info | 當(dāng)見到方法,進(jìn)入此方法 | F7 |
Force Step Info | 用于研究源碼 | |
Step Out | 跳出改方法 | |
Resume Program | 執(zhí)行下一個(gè)斷點(diǎn) | F9 |
Stop app | 停止調(diào)試 | |
View Breakpoints | 查看所有斷點(diǎn) |
二、Activity
生命周期
方法 | 狀態(tài) | Info |
---|---|---|
onCreate() | 頁面創(chuàng)建時(shí) | |
onStart() | 啟動狀態(tài) | 頁面可見時(shí) |
onResume() | 運(yùn)行狀態(tài) | 可獲取焦點(diǎn),與用戶交互時(shí) |
onPause() | 暫停狀態(tài) | 被其他頁面覆蓋或鎖屏?xí)r |
onStop() | 停止?fàn)顟B(tài) | 頁面不可見時(shí) |
onDestroy() | 銷毀狀態(tài) | 頁面銷毀時(shí) |
onRestart() | 從停止?fàn)顟B(tài)重新啟動時(shí) |
四種啟動模式
在Mainifest.xml
中通過activity
標(biāo)簽的launchMode
屬性可以設(shè)置啟動模式。
- standard模式:【不會檢測
Activity
是否重復(fù)】 - singleTop模式:【相同
Activity
且同時(shí)位于堆棧頂端(top)時(shí)才會重復(fù)處理】 - singleTask模式:【一個(gè)堆棧僅可以有可以實(shí)例的task,頂出其他
Activity
】 - singlesrance模式:【一個(gè)系統(tǒng)僅僅一個(gè)這樣的
Activity
】
頁面跳轉(zhuǎn)
-
顯式跳轉(zhuǎn)
Intent intent =new Intent(); intent.setClass(this,目標(biāo)頁面.class); startActivity(intent); //簡化 startActivity(new Intent(this,目標(biāo)頁面.class));
-
隱式跳轉(zhuǎn)
通過指定的action和category尋找目標(biāo)Activity,使用隱式intent還可以啟動其他app中的Activity。
Intent intent = new Intent(); intent.setAction("action"); startActivity(intent); //簡化 startActivity(new Intent("action"));
案例(打開瀏覽器)
//MainActivity.xml
//在按鈕的點(diǎn)擊事件中
Intent intent = new Intent();
//這是安卓系統(tǒng)內(nèi)置的Action,通過這個(gè)Action可以和瀏覽器進(jìn)行匹配
intent.setAction("android.intent.action.VIEW");
//設(shè)置要打開的網(wǎng)址
//Uri.parse()方法把 網(wǎng)址字符串 解析成 Uri對象 ,傳入setData()方法。
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
數(shù)據(jù)傳遞
//頁面1.xml
Intent intent = new Intent();
intent.setClass(LoginActivity.this,SelectTraActivity.class);
intent.putExtra("n1","我是要傳遞的數(shù)據(jù)");
intent.putExtra("n2",123);
startActivity(intent);
//頁面2.xml
String n1 = getIntent().getStringExtra("n1");
String n2 = getIntent().getIntExtra("n2");
數(shù)據(jù)回傳
目前 startActivityForResult() 已被棄用,替代方案為 Activity Result API
組件,這里不展開。
startActivityForResult(Intent intent,int requestCode);
該方法也用于啟動Activity,并且能在頁面銷毀時(shí)返回?cái)?shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-401091.html
實(shí)際應(yīng)用:微信發(fā)朋友圈時(shí),進(jìn)入圖庫選好照片后,會返回到發(fā)表狀態(tài)頁面并帶回所選的圖片信息。文章來源地址http://www.zghlxwxcb.cn/news/detail-401091.html
//頁面1.xml
Intent intent = new Intent(this,Activity02.class);
startActivityForResult(intent,1);
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1){
if (resultCode ==1){
String str = data.getStringExtra("name");
}
}
}
//頁面2.xml
Intent intent = new Intent();
intent.putExtra("name","abcdefg");
setResult(1,intent);
到了這里,關(guān)于Android Studio開發(fā)基礎(chǔ)知識(持續(xù)更新中~)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!