android應用開發一個主要內容就是界面開發。隨著移動設備的不斷普及,android應用幾乎無處不在,設計到各個領域。對於用戶來說,除瞭看重一個應用的功能外,圖形界面也是最關註的對象。如果一個應用沒有提供友好的圖形界面,那麼將很難吸引最終的用戶;相反,如果為應用程序提供一個友好的圖形界面(GUI),那麼用戶可以輕松的通過手指去點擊各種事件愛你,來操作這個應用程序,用戶就會感覺到”很爽“。就像windows系統一樣,最初能很快吸引大量用戶,就是因為它有豐富的圖形界面,才幾乎獨占整個市場。可想而知,友好的圖形界面是多麼的重要。
對於程序員來說,除瞭要開發出友好的圖形界面,還好去思考用什麼方式去實現比較好。android提供瞭大量功能豐富的UI組件,這些組件功能都具有一定的規律且具有很多相似之處,程序開發人員隻需要掌握這些規律,就可以實現出漂亮、友好的圖形界面瞭。在接下的一段時間裡,將會陸續介紹。今天我們就先介紹一下界面編程與視圖組件之間的聯系吧!
1、視圖組件與容器組件
在一個activity文件中,我們會看到很多包:
import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewSwitcher;
android應用的絕大多數UI組件都是放在android.widget包中以及其子包中、android.view包中以及其子包中。值得註意的是,android中所有的組件都是繼承瞭View類。View類是一個非常重要的類,其還有一個子類ViewGroup,但是ViewGoup類經常作為其他組件的容器使用。
還有一點值得說明的就是View與ViewGoup類之間的關系,View類包含ViewGoup類,同時ViewGoup類中也包含View類:
那麼在android項目中我們如何去實現界面開發呢?一般情況下,我們可以采用兩種方式來實現:
(1)、在XML佈局文件中通過XML屬性進行控制,一般推薦使用這種方式。
(2)、在Java程序代碼中通過調用方法進行控制。
無論是哪一種實現方式,其實他們的本質都是一樣的。在XML文件中實現UI組件,我們要是添加UI組件相應的XML屬性;在java代碼中實現UI組件,我們通過相應的屬性方式來控制組件的屬性,也就是說,其實每一個UI組件的XML屬性都會對應一個方法。UI組件的屬性包括View類常用的XML屬性及相關方法和ViewGoup類中常用的XML方法。
對View類來說,他們是所有UI組件的基類,因此它包含的XML屬性都會對應一個方法。常用的有:
XML屬性 | 相關方法 | 說明 |
---|---|---|
android:alpha | setAlpha(float) | 設置組件的透明度 |
android:background | setBackGroundResource(int) | 設置組建的背景顏色 |
android:id | setId(int) | 設置組件的唯一標識 |
android:keepScreenOn | setKeepSCreenOn(int) | 設置該組件是否強制手機屏幕一直打開 |
android:visibility | setVilibility(int) | 設置組件是否可見 |
ViewGroup類繼承瞭View類,因此也是可以當成一個普通的View類來使用的。但是,ViewGroup類主要是當成容器類來使用。又由於ViewGroup類是一個抽象類,因此在使用中,通常使用它的一些子類來作為容器,例如各種佈局管理器。ViewGroup容器控制其子組件的分佈依次是Viewgroup.LayoutParams、ViewGroup.MarginLayoutParams兩個內部類。這兩個內部類中都提供瞭一些XML屬性,ViewGroup容器中的子組件可以指定這些XML屬性。 Viewgroup.LayoutParams支持兩個XML屬性:
XML屬性 | 說明 |
android:layout_height | 指定該子組件佈局的高度 |
android:layout_width | 指定該子組件佈局的寬度 |
在XML佈局文件中這樣使用:
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_height、android:layout_width兩個屬性的值有三種: (1)、fill_parent:指定子組件的高度、寬度和父容器的高度、寬度相同(實際上還要減去填充的空白距離)。 (2)、match_parent:該屬性和fill_parent完全相同,但是在android2.2版本以後推薦使用這個。 (3)、wrap_parent:指定組件的大小恰好能包裹它裡面的內容。
另外ViewGroup.MarginLayoutParams支持四個XML屬性:
XML屬性 | 相關方法 | 說明 |
---|---|---|
android:layout_marginBottom | setMargins(int,int,int,int) | 指定子組件下邊的頁邊距 |
android:layout_marginLeft | setMargins(int,int,int,int) | 指定子組件左邊的頁邊距 |
android:layout_marginRight | setMargins(int,int,int,int) | 指定子組件右邊的頁邊距 |
android:layout_marginTop | setMargins(int,int,int,int) | 指定子組件上邊的頁邊距 |
在XML佈局文件中這樣使用:
android:layout_marginTop="10dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginBottom="10dp"
當然瞭組件的屬性遠不止這些,還有很多,以上列舉的隻是常用的幾個而已!
2、使用XML佈局文件來控制UI界面
android中常用和推薦使用的就是這種實現方式,它具有簡單、方便、清晰的特點,而且可以將應用的視圖控制邏輯從java代碼中分離出來,放入到XML文件進行控制,很好的提現瞭MVC原則。在之前我們也說瞭在XML文件實現組件的方法,,下面再簡單介紹一下:
(1)在XML文件中設置佈局組件:
例如我實現一個Text控件:
接下來我們就需要在Activity中先找到這個佈局文件:
setContentView(R.layout.main);
接下來就是去訪問這個組件,需要綁定她的ID,這樣才知道要訪問的組件是哪一個:
private Text showText;
showText = (Text) findViewById(R.id.show_helloworld);
一旦獲取指定的UI組件之後,就可以通過代碼控制這個組件的屬性以及UI組件綁定的監聽事件。
(2)在代碼中控制UI界面
雖然android中推薦使用XML文件來控制組件,如果開發者需要也可以在java代碼 中去實現控制一個組件,可以完全拋棄XML文件的限制。
下面我們就接上上面的實現,假設上面的主界面是通過XML文件來實現的,下面我們通過點擊Text控件,來調到另一個Activity頁面,這個Activity頁面是通過java代碼來實現的。
新建一個JavaActivity類,添加代碼:
//創建一個線性佈局管理器 LinearLayout layout = new LinearLayout(this); //設置anctivity顯示layout super.setContentView(layout); layout.setOrientation(LinearLayout.VERTICAL); //創建一個TextView final TextView textView = new TextView(this); textView.setText("我是通過java代碼實現的……"); layout.addView(textView);
在MainActivity類中調用:
showText = (Button) findViewById(R.id.show_helloworld); showText.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this,JavaActivity.class); startActivity(intent); } });
效果如圖:
從上面的代碼我們可以看到,javaactivity類中的組件是通過new關鍵字創建的,然後程序使用LineLayout容器來“存放”這些組件,這樣就組成瞭圖形用戶。
在很多情況下我們都要傳一個參數this,這是為什麼呢?這是因為由於創建UI組件時傳入瞭一個Content參數,Content代表訪問android應用環境的全局信息的API。讓UI組件持有一個Content參數,可以讓這些UI組件通過該Content參數獲取android應用環境的全局信息。Content本身是一個抽象類,android的應用組件如Activity、server都是繼承瞭Content,因此Activity、Server都可以直接作為Content使用。
除瞭上面兩種實現控制UI組件,我們一般還可以將兩種方式結合使用,這樣就可以更加靈活的開發瞭,這個就不說瞭!大傢可以自己動手嘗試,創建一個新項目,親身體會一下!
好瞭,今天我們要將的就結束瞭大傢感覺是不是很簡單,看再多的次數,不如親手敲一下代碼,=這樣才能發現更多的問題,才能思考的更深。下次我們將繼續介紹新的知識-android四大基本佈局+新增佈局,歡迎大傢繼續關註,我們一起交流、一起進步……