Android學習心得第二課
用了接近一個星期的時間終於將慕課上的Android第一季給看完了,在這裡不得不給那位amos老師打一個廣告,講的真的很贊。下面直接總結我這周學習的幾個點吧。
第一部分 ToggleButton
ToggleButton是一個多狀態的按鈕,通過這個按鈕可以達到一個狀態的切換,比如下面這個例子所講解的。
public class MainActivity extends Activity {
private ToggleButton tb;
private ImageView imgv;
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tb = (ToggleButton) findViewById(R.id.toggleButton1);
imgv = (ImageView) findViewById(R.id.imageView1);
// 為當前的tb設定監聽器,這裡採用的是匿名內部類的寫法
tb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
/*
* 當tb被點選的時候當前的方法會執行
* ButtonView代表被點選的按鈕本身
* 當被點選的按鈕有很多的時候就需要有這個引數來表示是第幾個控制元件
* isChecked表示的是被點選的控制元件的狀態
* 當點選這個tb的時候,改變img的背景
*/
public void onCheckedChanged(CompoundButton ButtonView, boolean isChecked) {
imgv.setBackgroundResource(isChecked?R.drawable.on:R.drawable.off);
}
});
}
}
這裡togglebutton的作用就是通過點選這個按鈕來實現背景圖片的一個變化,setBackgroundResource這個函式就是實現這個功能的。
這裡筆者曾經犯了一個非常可笑的錯誤,先把xml配置檔案放上來
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignLeft="@+id/toggleButton1"
android:layout_below="@+id/toggleButton1"
android:background="@drawable/off"
/>
筆者在一開始寫的時候將android:background="@drawable/off"
這句話寫成了android:src="@drawable/off"
,導致的結果是原本的button無法起到切換狀態的作用,幸得他人的提醒才發現,筆者因為這個簡單的錯誤糾結了一下午,雖然src和backgroud設定圖片上看起來效果一樣,但是src的話,上面java程式碼中的setBackgroundResource函式將無法起到作用,在以後的學習中一定要注意到這一點。
第二部分 CheckBox和RadioGroup以及RadioButton
這部分比較簡單,沒有什麼可以特別講解的,稍微提一下的是checkbox和RadioButton在某種程度上是對立的,checkbox一般是用於多選的,比如網站上經常會問你對哪些方面的知識感興趣,這時候下面的選擇框就是checkbox,而RadioButton主要是用來作為單選的按鈕的,比如網站經常會讓人填寫性別,這個就需要用到RadioButton,因為人的性別只有一個。
下面分別上兩種不同按鈕的程式碼,首先是checkbox
public class MainActivity extends Activity {
private CheckBox checkBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化控制元件
checkBox = (CheckBox) findViewById(R.id.checkBox1);
/*
*對checkbox設定監聽事件來判斷checkbox是否被選中
*/
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
System.out.println(isChecked);
if(isChecked){
//獲得checkbox的文字內容
String text = checkBox.getText().toString();
Log.i("tag", text);
}
}
});
}
再接著是RadioButton
public class MainActivity extends Activity {
private RadioGroup rg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rg = (RadioGroup) findViewById(R.id.radioGroup1);
/*
*設定radiogroup的監聽器
*/
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radio0:
Log.i("tag", "你是一個男孩");
break;
case R.id.radio1:
Log.i("tag", "你是一個女孩");
default:
break;
}
}
});
}
}
第三部分 Intent實現頁面的跳轉
這是我這周學過的最重要的一個點了,Android的各介面之間是相互聯絡的,一個應用寫出來不可能只有一個介面,那麼這些介面要實現相互之間的跳轉就需要依靠Intent來實現。
Intent是不同元件之間相互通訊的紐帶,封裝了不同元件之間通訊的條件。Intent本身是定義為一個類別(Class),一個Intent物件表達一個目的(Goal)或期望(Expectation),敘述其所期望的服務或動作、與動作有關的資料等。Android則根據此Intent物件之敘述,負責配對,找出相配的元件,然後將 Intent物件傳遞給所找到的元件,Android的媒婆任務就完成了。
這段話來自csdn某位大神的部落格,個人感覺對Intent的講解十分到位,這裡引用出來供大家參考。
一般來說運用Intent的時候有兩種方式來實現頁面的跳,一種是無返回值的頁面跳轉,一種是有返回值的頁面跳轉。
這裡分別對兩種方式進行一個介紹
不帶返回值的跳轉方式
public class FActivity extends Activity{
private Button bt1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.factivity);
bt1 = (Button) findViewById(R.id.button1_first);
// 註冊點選事件
bt1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
/*
*1.採用的是startActivity的方式來實現跳轉
*2.Intent函式裡面的第一引數指的是上下文
*3.第二個引數指的是要跳轉的頁面
*4.啟動跳轉
*/
Intent intent = new Intent(FActivity.this, SActivity.class);
startActivity(intent);
}
});
}
startActivity方法就是用來實現無返回值的跳轉,返回的是一個intent物件。
帶返回值的跳轉方式
public class FActivity extends Activity{
private Button bt2;
private TextView tv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.factivity);
bt2 = (Button) findViewById(R.id.button2_second);
tv = (TextView) findViewById(R.id.textView1);
/*
*這裡採用的是第二種的跳轉方式,startActivityForResult的方式來進行跳轉的
* startActivityForResult的第二引數是請求的一個標識
* 這裡即第一個頁面
*/
bt2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FActivity.this,SActivity.class);
startActivityForResult(intent, 1);
}
});
}
/*
* requestCode---第一個頁面的識別符號
* resultCode----第二個頁面的標識
* data-----第二個頁面返回的資料
*/
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1 && resultCode==2){
String content = data.getStringExtra("data");
tv.setText(content);
}
}
}
而在這裡第二個頁面也需要作出相應的反應
public class SActivity extends Activity{
private Button bt1_second;
private String res = "你好";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sacivity);
bt1_second = (Button) findViewById(R.id.button1);
bt1_second.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//第二個頁面返回給第一個頁面的物件其實是一個intent物件
Intent data = new Intent();
data.putExtra("data",res);
//將data回傳給第一個頁面,第一個是識別符號
setResult(2, data);
//結束當前頁面
finish();
}
});
}
這裡面的finish函式其實就相當java裡面的那個銷燬的函式,可以節省記憶體資源。startActivityForResult這個函式用來實現帶返回值的Intent的跳轉,requestCode,resultCode這兩個引數比較重要,因為當一個程式的邏輯複雜到一定程度的時候,這兩個引數就可以標識出誰哪個頁面需要跳轉到哪個頁面。