《Android開發實戰 從學習到產品》李瑞琪編著 學習筆記。
一、常用基本控件的使用
1.Android常用控件類:
控件名稱 | 描述 | 控件名稱 | 描述 |
---|---|---|---|
TextView | 文本顯示控件 | SeekBar | 拖動條控件 |
Button | 按鈕控件 | ProgressBar | 進度條控件 |
EditText | 文本編輯框控件 | ScrollView | 可滾動視圖控件 |
ImageView | 圖片顯示控件 | DatePicker | 日期顯示控件 |
ImageButon | 圖片作爲按鈕控件 | TimePicker | 時間顯示控件 |
RadioGroup | 單選按鈕控件 | Dialog | 對話框控件 |
CheckBox | 複選框控件 | Toast | 信息提示框控件 |
Spinner | 下拉列表控件 |
2.基本控件的使用
TextView、EditText、Button、SeekBar、ImageView、RadioGroup控件。activity_main.xml(即Activity對應的佈局文件)中代碼(代碼中註釋了部分屬性功能):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="部分控件!"
android:id="@+id/show_text"
android:textSize="25dp"
android:textColor="#ff00ff"/>
<EditText
android:layout_width="match_parent"
android:layout_height="70dp"
android:id="@+id/show_edit"
android:enabled="true"
android:hint="(文本編輯框控件)請輸入數字:"
android:inputType="number"
android:textSize="25dp"
/>
<SeekBar
android:layout_width="match_parent"
android:layout_height="30dp"
android:id="@+id/seek_bar" /><!--SeekBar拖拉控件-->
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:id="@+id/show_button"
android:text="展現一個button按鈕"/><!--android:visibility="gone"控件不可見,不佔空間-->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show_image"
android:src="@drawable/cry"
android:visibility="invisible"/><!--控件不可見,佔空間-->
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show_group_button"
android:orientation="horizontal">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/paiqiu"
android:text="排球"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lanqiu"
android:text="籃球"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/zuqiu"
android:text="足球"/>
</RadioGroup>
</LinearLayout>
控件在佈局中顯示效果:
在activity_main.xml設置了Button和ImageView不可見(可直接.XML文件改屬性值使之可見),也可在activity_main.xml對應的MainActivity.java文件中用Java碼設置其可見,可在MainActivity類中創建一個initView()方法,最後在onCreate()方法中調用該方法,代碼中註釋了部分方法功能。
private void initView(){
TextView textView = (TextView)findViewById(R.id.show_text);//獲取TextView控件
textView.setText("通過代碼控制TextView");//設置TextView內容
textView.setTextSize(20);//設置textView文字大小
EditText editText = (EditText)findViewById(R.id.show_edit);
editText.getText().toString();//獲取editText內容
editText.setInputType(InputType.TYPE_CLASS_TEXT);//設置EditText輸入內容爲Text類型
Button button = (Button)findViewById(R.id.show_button);
button.setVisibility(View.VISIBLE);//設置Button可見
ImageView imageView = (ImageView)findViewById(R.id.show_image);
imageView.setVisibility(View.VISIBLE);
imageView.setImageResource(R.drawable.cry);//設置ImageView的圖片
RadioGroup radioGroup = (RadioGroup)findViewById(R.id.show_group_button);
radioGroup.check(R.id.zuqiu);//默認選中足球
}
使用代碼控制控件後在佈局中所顯示:
Toast控件:Android中用來顯示信息的一種方式,無焦點,過一定時間會自動消失。使用Toast 只需設置要顯示的內容、顯示時長、顯示位置後調用show()方法即可。創建一個方法使用Toast控件:
private void toast(){
/*一般情況使用Toast類的靜態方法makeToast,後調用show()方法
* 參數意義:makeToast(context對象,“顯示內容”,顯示長度)*/
Toast toast = Toast.makeText(this,"顯示位置的方式",Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER,0,0);//設置Toast顯示位置,默認界面底部
toast.show();
Toast.makeText(this, "常用方式", Toast.LENGTH_SHORT).show();//一般顯示Toast方式
}
在onCreate()方法中調用上述方法,顯示如圖:
**Dialog控件:**對話框控件,一個小窗口,有四種常用對話框:
- AlertDialog:警告對話框,使用最廣範。可包含 標題、內容消息或選擇列表、最多3個按鈕。
AlterDialog create()根據設置的屬性創建一個 AlterDialog
AlterDialog showo根據設置的屬性創建一個 Alterdialog,並顯示在屏幕上
AlterDialog, Builder setTitleo設置標題
AlterDialog Builder setlcon0設置標題的圖標
AlterDalog Builder setmessage()設置標題的內容
AlterDialog, Builder setcancelableo設置是否模態,一般設置爲 false,表示模態,要求用戶必須採取行動才能繼續進行剩下的操作 - ProgressDialog:進度條對話框,對進度條進行了簡單封裝。
- DatePickerDialog:日期對話框。
- TimePickDialog:時間對話框。
AlertDialog實例:創建myDialog()方法:
private void myDialog(){
/*初始化一個ALertDialog的內置對象builder*/
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("提示!");//設置Dialog的標題
builder.setMessage("現在顯示的是包含多個按鈕及一個Icon的對話框");//設置顯示內容
builder.setIcon(R.drawable.cry);//設置Icon
/*添加一個確定按鈕*/
builder.setPositiveButton("確定",new DialogInterface.OnClickListener(){
//設置點擊確定後使Toast顯示一行文字,並使Dialog消失
public void onClick(DialogInterface dialog,int which){
Toast.makeText(MainActivity.this, "確定被點擊了", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
/*添加一個以後再說按鈕*/
builder.setNegativeButton("以後再說",new DialogInterface.OnClickListener(){
//設置點擊確定後使Toast顯示一行文字,並使Dialog消失
public void onClick(DialogInterface dialog,int which){
Toast.makeText(MainActivity.this, "以後再說被點擊了", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
/*添加一個忽略按鈕*/
builder.setNeutralButton("忽略",new DialogInterface.OnClickListener(){
//設置點擊確定後使Toast顯示一行文字,並使Dialog消失
public void onClick(DialogInterface dialog,int which){
Toast.makeText(MainActivity.this, "忽略被點擊了", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
/*使用模態,即不對上述三個按鈕做操作就不能繼續其他操作,默認爲可進行其他操作*/
builder.setCancelable(false);
builder.show();//調用show()方法顯示這個Dialog
}
在onCreate()中調用它,顯示圖:
3.Android中尺寸
- px:像素,Android中不建議使用。
- dp:非文字尺寸用dp
- sp:文字尺寸用sp
二、Android 中事件處理
事件處理基本可分爲3個步驟:
<1>. 獲取觸發事件的對象。如點擊了Button,就要獲取該Button對象。
<2>. 實現一個對應事件的處理接口。每個事件都有對應的事件處理接口,在事件處理中必須實現事件處理接口。
<3>. 用獲取的控件對象獲取對象調用該控件的某個事件監聽方法,將第二步實現的接口類的對象作爲參數傳入,並對該事件進行註冊。
1.點擊事件
點擊事件:點擊某個控件而觸發的事件,常見於Button,TextView和ImageView等也有使用。
以Button和TextView爲例:Activity對應的佈局文件.XML中代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button_event"
android:text="來點我啊~"
android:textSize="26sp"
android:textColor="#ff00ff"
android:layout_marginBottom="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_event"
android:text="我是個TextView!"
android:textSize="26sp"/>
</LinearLayout>
Activity中處理代碼(.java文件代碼,詳見註釋):
package com.example.day0922eventactivity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
// 實現View.OnClickListener 看下面3.~
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intiView();
}
private void intiView(){
button = (Button)findViewById(R.id.button_event);//1.使用indViewById獲取Buttond按鈕的對象
textView = (TextView)findViewById(R.id.text_event);// 獲取TextView按鈕的對象
button.setOnClickListener(this); //3.調用setOnClickListener點擊事件的監聽方法
textView.setOnClickListener(this); // 並將View.OnClickListener接口實現類的對象傳入
// 實例是用Activity實現的,所以傳入了this對象
//在第三步調用setOnClickListener()方法時,系統會對View進行註冊,所以onClick()方法中可以從getId()方法獲取控件id
}
public void onClick(View v){ //2.讓Activity實現點擊事件對的處理接口
// View.OnClickListener並實現onClick()方法
switch(v.getId()){
case R.id.text_event:
Toast.makeText(this,"您點擊了一個TextView",Toast.LENGTH_LONG).show();
break;
case R.id.button_event:
Toast.makeText(this,"您點擊了一個Button",Toast.LENGTH_LONG).show();
break;
}
}
}
效果圖:
在處理點擊事件時,實現事件處理接口的方式有三種,
- 主類中實現onClickListener接口:上述實例即爲該種最常用方式,在主類中實現OnClickListener接口( implements View.OnClickListener)並重寫onClick方法。
- 內部類方式實現:在Activity內創建一個內部類,並在內部類內重寫onClicK(View view)方法。如(先在主類中刪除implements View.OnClickListener):
/*二、內部類實現onClickListener()接口並重寫onClick()方法*/
private class clickListener implements View.OnClickListener{
public void onClick(View v){
switch(v.getId()){
case R.id.text_event:
Toast.makeText(MainActivity.this,"您點擊了一個TextView",Toast.LENGTH_LONG).show();
break;
case R.id.button_event:
Toast.makeText(MainActivity.this,"您點擊了一個Button",Toast.LENGTH_LONG).show();
break;
}
}
}
private void intiView(){
button = (Button)findViewById(R.id.button_event);
textView = (TextView)findViewById(R.id.text_event);
button.setOnClickListener(new clickListener()); //傳入實現了OnClickListener接口的類對象
textView.setOnClickListener(new clickListener());
}
效果相同,效果圖亦相同。
- 匿名內部類方式實現:直接在控件對象調用setOnclickListener()方法時,以匿名內部類的方式傳入事件處理接口的對象。如:
/**三、匿名內部類實現*/
private void intiView(){
button = (Button)findViewById(R.id.button_event);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"您點擊了一個Button按鈕",Toast.LENGTH_LONG).show();
}
});
textView = (TextView) findViewById(R.id.text_event);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"您點擊了一個TextView按鈕",Toast.LENGTH_LONG).show();
}
});
}
效果相同,需注意,該方式需要在Button和TextView中都這樣處理,若點擊事件較多會使得代碼冗餘。
2.長按事件
長按事件:長按了 某個控件而觸發的事件。TextView、Button等控件經常會使用長按事件,另外佈局管理器(如LinearLayout)也可以有長按事件。下面以LinearLayout爲例,對LinearLayout添加長按事件,就在點擊事件的基礎上修改。
(1)給LinearLayout添加id(.XML文件中)
(2)讓主Activity實現長按事件處理接口View.OnLongClickListener
public class MainActivity extends AppCompatActivity implements View.OnClickListener,View.OnLongClickListener
//View.OnClickListener是實現前面點擊事件處理接口
(3)實現長按事件處理接口中的onLongClick方法
public boolean onLongClick(View v){ //長按事件
Toast.makeText(MainActivity.this,"您長按了一個LinearLayout",Toast.LENGTH_LONG).show();
return true;
}
(4)在initView()方法中獲取LinearLayout對像,並調用setOnLongClickListener()方法進行註冊:
linearLayout = (LinearLayout)findViewById(R.id.long_click_event);
linearLayout.setOnLongClickListener(this);
長按事件效果:
3.觸摸事件
觸摸事件:指觸摸了某個控件而觸發的事件,在TextView、ImageView等控件中較常用。現以TextView爲例添加觸摸事件(在前面點擊事件的基礎上添加的哦)。
(1)讓Activity實現觸摸事件的事件處理接口View.OnTouchListener。
public class MainActivity extends AppCompatActivity implements View.OnTouchListener{
...
}
(2)實現觸摸事件接口中onTouch方法:
public boolean onTouch(View v, MotionEvent event){
Toast.makeText(this, "您觸摸了一個TextView,它的座標是"+"X="+event.getX()+",Y="+event.getY(), Toast.LENGTH_SHORT).show();
return false;
}
如果同時對控件進行了 setOnClickListener()和setOnTouchListener()設置,那麼只有當setOnTouchListener()返回false時點擊事件纔會響應。
(3)獲取TextView後,調用setOnTouchListener()方法進行註冊。
textView.setOnTouchListener(this);
觸摸事件與其他事件不同的地方在於他在用戶觸摸控件之後會返回一個MotionEvent對象,使用此對象可以獲取控件的座標。
4.按鍵事件
按鍵事件主要在EditText中使用,用於監聽輸入的內容。在點擊事件的例子上稍加改動:
(1)在佈局文件中加入一個EditText:
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edit_event"
android:textSize="26sp"/>
(2)用Activity實現按鍵事件處理接口implements View.OnKeyListener
public class MainActivity extends AppCompatActivity implements View.OnKeyListener{
...
}
(3)實現按鍵事件處理接口中的方法onKey方法:
public boolean onKey(View v, int keyCode, KeyEvent event){ //按鍵事件
switch(event.getAction()){
case KeyEvent.ACTION_DOWN:
Toast.makeText(this, "按鍵落下啦!", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.ACTION_UP:
EditText et = (EditText)v;
Toast.makeText(this, "按鍵彈起啦!鍵入的是:"+et.getText().toString(), Toast.LENGTH_SHORT).show();
break;
}
return false;
}
實現onKey(View v,int keyCode,KeyEvent event),方法中3個參數:
- View參數:指操作事件的View對象
- keyCode:輸入按鍵的編碼數字
- event:表示按鍵落下與彈起的狀態
返回值若返回的是true,意味着系統只處理代碼中的這些事件,如本例中的Toast ,而不處理其他動作,如EditText中寫入文本,所以一般情況下返回false。
(4)在initView中獲取EditText控件,並調用setOnKeyListener()方法進行註冊:
editText = (EditText)findViewById(R.id.edit_event);
editText.setOnKeyListener(this);
結果觸發了事件
5.下拉列表的選中事件
(1)在佈局文件中加入一個表示位置的下拉列表:
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/spinner_event"
android:entries="@array/location"/>
*android:entries 用來選擇Spinner下拉選項內容的屬性,在開發時,我們會在res/values中建立數組作爲此屬性的內容,向Spinner的下拉選項中注入數據。*因此,在res/values中新建一個location.xml,並建立一個數組:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="location">
<item>南昌</item>
<item>贛州</item>
<item>上饒</item>
<item>九江</item>
<item>撫州</item>
</string-array>
</resources>
(2)使Activity實現下拉列表事件處理接口 AdapterView.OnItemSelectedListener,實際爲下拉列表某個條目的處理接口。實現該接口的處理方法onItemSelected方法:
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener,
/**下拉列表事件*/
public void onItemSelected(AdapterView<?>parent,View view,int position,long id){ //選中某個條目之後的處理方法
String value = parent.getItemAtPosition(position).toString();
editText.setText("你丫的位置是:"+value+"!"); //選中條目時顯示在EditText中
}
public void onNothingSelected(AdapterView<?>parent){ //沒有任何條目被選中的處理方法
}
(3)獲取對象,調用監聽方法
spinner = (Spinner)findViewById(R.id.spinner_event);
spinner.setOnItemSelectedListener(this);
運行結果:
6.單選按鈕的改變事件
該事件只適用於單選按鈕,實例如下:
(1)在文件中加入一個單選按鈕
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:id="@+id/sex_event">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/male"
android:text="男"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/female"
android:text="女"/>
</RadioGroup>
(2)讓Activity實現RadioGroup.OnClickListener接口,實現它得事件處理方法onCheckedChanged(),獲取獲取控件並調用監聽事件,
//實現RadioGroup.OnClickListener接口
public class MainActivity extends AppCompatActivity implements RadioGroup.OnClickListener,...{
...
}
//實現它得事件處理方法onCheckedChanged()
public void onCheckedChanged(RadioGroup group,int checkedId){ //單選按鈕事件
RadioButton radioButton = (RadioButton)findViewById(checkedId);
Toast.makeText(this, "您丫選擇了:"+radioButton.getText().toString(), Toast.LENGTH_SHORT).show();
}
//獲取獲取控件並調用監聽事件
radioGroup = (RadioGroup)findViewById(R.id.sex_event);
radioGroup.setOnCheckedChangeListener(this);
運行結果:
7.焦點事件
.
焦點事件是指在多控件或多組件狀態下,操作某個控件就意味着該控件獲取了焦點,同時之前獲得焦點的控件失去了焦點。下面用兩個EditText演示焦點事件。
佈局文件添加兩個EditView(同上),Activity實現焦點事件處理接口View.OnFcusChangeListener(同上),實現它的事件處理方法onFoucusChange(View v,boolean hasFoucus):
public void onFocusChange(View v,boolean hasFocus){ //焦點事件
if(hasFocus){
Toast.makeText(this, "第一個EditView獲得了焦點", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "第二個EditView獲得了焦點", Toast.LENGTH_SHORT).show();
}
}
獲取控件對象(findViewById),調用監聽方法(editText1.setOnFocusChangeListener(this);
editText2.setOnFocusChangeListener(this);),運行程序: