20169211《移動平臺開發實踐》第七週做業

教材學習內容總結


1、常見控件

Android控件的可見屬性:全部的Android控件都具備這個屬性,能夠經過android:visibility進行指定,可選值有三種,visible、invisible和gone。visible表示控件是可見的,這個值是默認值,不指定android:visibility時,控件都是可見的。invisible表示控件不可見,可是它仍然佔據着原來的位置和大小,能夠理解成控件變成透明狀態了。gone則表示控件不只不可見,並且再也不佔用任何屏幕空間。咱們還能夠經過代碼來設置控件的可見性,使用的是setVisibility()方法,能夠傳入View.VISIBLE、View.INVISIBLE和View.GONE三種值。java

一、TextView:顯示文本

<TextView 
	android:id="@+id/text_view" //控件ID
	android:layout_width="match_parent"   //文字寬度。fill_parent意義相同,但推薦match_parent
	android:layout_height="wrap_content" //文字高度
	android:text="This is TextView" //文字內容
	android:gravity="center"//文字對齊方式,可選值有top、bottom、left、right、center等,能夠用「|」來同時指定多個值,這裏咱們指定的"center",效果等同於"center_vertical|center_horizontal",表示文字在垂直和水平方向都居中對齊。
	android:textSize="24sp" //文字大小
	android:textColor="#00ff00" //文字顏色  />

二、Button:按鈕,可響應點擊事件

<Button 
	android:id="@+id/button" 
	android:layout_width="match_parent" 
	android:layout_height="wrap_content" 
	android:text="Button" />

java代碼:android

定義
private Button button; 
根據ID獲取控件
button = (Button) findViewById(R.id.button); 
添加點擊事件
button.setOnClickListener(new OnClickListener() { 
	@Override 
	public void onClick(View v) { 
		// 在此處添加邏輯 
	} 
}); 
或者 類 implements OnClickListener 
button.setOnClickListener(this); 
@Override 
public void onClick(View v) { 
	switch (v.getId()) { 
		case R.id.button: 
		// 在此處添加邏輯 
		break; 
		default: 
		break; 
	} 
}

三、EditText:容許用戶輸入和編輯內容,程序處理內容

<EditText 
	android:id="@+id/edit_text" 
	android:layout_width="match_parent" 
	android:layout_height="wrap_content" 
	android:inputType="textPassword"//輸入類型爲密碼
	android:hint="Type something here" //提示性文本,用戶輸入後消失
	android:maxLines="2" //指定最大行數,超過期文本會滾動顯示
/>

java代碼:git

private EditText editText; 
editText = (EditText) findViewById(R.id.edit_text); 
String inputText = editText.getText().toString(); //得到輸入的內容

四、ImageView:展現圖片,圖片放在res/drawable裏面

<ImageView 
	android:id="@+id/image_view" 
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content" 
	android:src="@drawable/ic_launcher" //指定圖片資源,也能夠經過代碼指定
/>

java代碼:編程

private ImageView imageView; 
imageView = (ImageView) findViewById(R.id.image_view); 
imageView.setImageResource(R.drawable.jelly_bean); //指定圖片資源

五、ProgressBar:顯示進度條

<ProgressBar 
	android:id="@+id/progress_bar" 
	android:layout_width="match_parent" 
	android:layout_height="wrap_content" 
	style="?android:attr/progressBarStyleHorizontal" //水平進度條,不加style是默認圓形的
	android:max="100" />

java代碼中動態改變進度條進度:設計模式

int progress = progressBar.getProgress(); 
progress = progress + 10; 
progressBar.setProgress(progress);

提示:Clean項目、若是遇到錯誤,提示如Caused by: java.lang.ClassCastException: android.widget.ProgressBar cannot be cast to android.widget.Button,代碼無誤的狀況下選擇eclipse的項目--清理,重構一下項目(從新編譯)後程序正常運行。網絡

六、進度條樣式

(1)普通圓形框架

該類型進度條也就是一個表示運轉的過程,例如發送短信,鏈接網絡等等,表示一個過程正在執行中。沒有設置它的風格,那麼它就是圓形的,一直會旋轉的進度條。eclipse

(2)超大號圓形ide

style="?android:attr/progressBarStyleLarge"

(3)小號圓形函數

style="?android:attr/progressBarStyleSmall"

(4)標題型圓形

style="?android:attr/progressBarStyleSmallTitle"

代碼實現:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    //請求窗口特點風格,這裏設置成不明確的進度風格
    setContentView(R.layout.second);
    setProgressBarIndeterminateVisibility(true);
    //設置標題欄中的不明確的進度條是否能夠顯示
}

(5)長方形進度條

<progressBar android:id="@+id/progressbar_updown"
	android:layout_width="200dp" 
	android:layout_height="wrap_content"
	style="?android:attr/progressBarStyleHorizontal"
	android:layout_gravity="center_vertical" 
	android:max="100"//最大進度值爲100
	android:progress="50"//初始化的進度值
	android:secondaryProgress="70"//初始化底層的第二個進度值   />

代碼應用:

private ProgressBar myProgressBar;
myProgressBar = (ProgressBar) findViewById(R.id.progressbar_updown);
myProgressBar.incrementProgressBy(5);
//ProgressBar進度值增長5
myProgressBar.incrementProgressBy(-5);
//ProgressBar進度值減小5
myProgressBar.incrementSecondaryProgressBy(5);
//ProgressBar背後的第二個進度條 進度值增長5
myProgressBar.incrementSecondaryProgressBy(-5);
//ProgressBar背後的第二個進度條 進度值減小5

(6)標題中的長進度條

代碼實現:

requestWindowFeature(Window.FEATURE_PROGRESS);
//請求一個窗口進度條特性風格
setContentView(R.layout.main);
setProgressBarVisibility(true);
//設置進度條可視
setProgress(myProgressBar.getProgress() * 100);
//設置標題欄中前景的一個進度條進度值
setSecondaryProgress(myProgressBar.getSecondaryProgress() * 100);
//設置標題欄中後面的一個進度條進度值
//ProgressBar.getSecondaryProgress() 是用來獲取其餘進度條的進度值

七、AlertDialog

在當前的界面彈出一個對話框,可以屏蔽掉其餘控件的交互能力。

代碼:

AlertDialog.Builder dialog = new AlertDialog.Builder (MainActivity.this); 
dialog.setTitle("This is Dialog"); 
dialog.setMessage("Something important."); 
dialog.setCancelable(false); 
//肯定按鈕的點擊事件
dialog.setPositiveButton("OK", new DialogInterface. OnClickListener() { 
  @Override 
	public void onClick(DialogInterface dialog, int which) { 
	} 
}); 
//取消按鈕的點擊事件
dialog.setNegativeButton("Cancel", new DialogInterface. OnClickListener() { 
	@Override 
	public void onClick(DialogInterface dialog, int which) { 
	} 
}); 
dialog.show();

八、ProgressDialog

和alertdialog相似,會在對話框中顯示一個進度條,通常是用於表示當前操做比較耗時,讓用戶耐心地等待。

(1)圖形

代碼實現:

ProgressDialog mypDialog=new ProgressDialog(this);  //實例化
mypDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
//設置進度條風格,風格爲圓形,旋轉的
mypDialog.setTitle("Google");
//設置ProgressDialog 標題
mypDialog.setMessage(getResources().getString(R.string.second));
//設置ProgressDialog 提示信息
mypDialog.setIcon(R.drawable.android);
//設置ProgressDialog 標題圖標
mypDialog.setButton("Google",this);
//設置ProgressDialog 的一個Button
mypDialog.setIndeterminate(false);
//設置ProgressDialog 的進度條是否不明確
mypDialog.setCancelable(true);
//設置ProgressDialog 是否能夠按退回按鍵取消
mypDialog.show();
//讓ProgressDialog顯示

(2)長方形

代碼實現:

ProgressDialog mypDialog=new ProgressDialog(this);//實例化
mypDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//設置進度條風格,風格爲長形,有刻度的
mypDialog.setTitle("地獄怒獸");
//設置ProgressDialog 標題
mypDialog.setMessage(getResources().getString(R.string.second));
//設置ProgressDialog 提示信息
mypDialog.setIcon(R.drawable.android);
//設置ProgressDialog 標題圖標
mypDialog.setProgress(59);
//設置ProgressDialog 進度條進度
mypDialog.setButton("地獄曙光",this);
//設置ProgressDialog 的一個Button
mypDialog.setIndeterminate(false);
//設置ProgressDialog 的進度條是否不明確
mypDialog.setCancelable(true);
//設置ProgressDialog 是否能夠按退回按鍵取消
mypDialog.show();
//讓ProgressDialog顯示

九、ListView

ListView容許用戶經過手指上下滑動的方式將屏幕外的數據滾動到屏幕內,同時屏幕上原有的數據則會滾動出屏幕。

2、佈局

一、LinearLayout 線性佈局

這個佈局會將它所包含的控件在線性方向上依次排列。

- android:orientation:指定方向,vertical垂直,horizontal水平。若是LinearLayout的排列方向是horizontal,內部的控件就絕對不能將寬度指定爲match_parent,由於這樣的話單獨一個控件就會將整個水平方向佔滿,其餘的控件就沒有可放置的位置了。一樣的道理,若是LinearLayout的排列方向是vertical,內部的控件就不能將高度指定爲match_parent。 

- android:layout_gravity:控件在佈局中的對齊方式。當LinearLayout的排列方向是horizontal時,只有垂直方向上的對齊方式纔會生效,由於此時水平方向上的長度是不固定的,每添加一個控件,水平方向上的長度都會改變,於是沒法指定該方向上的對齊方式。一樣的道理,當LinearLayout的排列方向是vertical時,只有水平方向上的對齊方式纔會生效。

- android:layout_weight:用權值分配空間,此時寬度/高度應爲0。例如兩個控件,weight都爲1,表示1:1平分空間。

二、RelativeLayout 相對佈局

經過相對定位的方式讓控件出如今佈局的任何位置。

- 相對父佈局:android:layout_alignParentLeft、android:layout_alignParentTop、android:layout_alignParentRight、android:layout_alignParentBottom、android:layout_centerInParent:對齊父佈局的左上角、右上角、左下角、右下角,居中。

- 相對控件:android:layout_above、android:layout_below、android:layout_toLeftOf、android:layout_toRightOf:在某控件的上下左右,控件必定要定義在某控件的後面。android:layout_alignLeft、android:layout_alignRight、android:layout_alignTop、android:layout_ alignBottom:跟某控件對齊左右上下邊緣。

三、FrameLayout 框架佈局

全部的控件都會擺放在佈局的左上角。能夠用來展現圖片。

四、TableLayout 表格佈局

使用表格的方式來排列控件。

每加入一個TableRow就表示在表格中添加了一行,而後在TableRow中每加入一個控件,就表示在該行中加入了一列,TableRow中的控件是不能指定寬度的。android:layout_span="2":可讓某控件佔兩列的寬度。

android:stretchColumns:容許將TableLayout中的某一列進行拉伸,以達到自動適應屏幕寬度的做用,android:stretchColumns="0" 指拉伸第一列。

五、AbsoluteLayout 絕對佈局

全部控件的位置都是指定的,適應性比較差,不推薦使用。

android:layout_x,android:layout_y指定座標。

3、單位和尺寸

在佈局文件中指定寬高的固定大小有如下經常使用單位可供選擇:px、pt、dp和sp。px是像素的意思,即屏幕中能夠顯示的最小元素單元。pt是磅數的意思,1磅等於1/72英寸,通常pt都會做爲字體的單位來使用。 Android中的密度就是屏幕每英寸所包含的像素數,一般以dpi爲單位。代碼瞭解當前密度值:

float xdpi = getResources().getDisplayMetrics().xdpi; 

float ydpi = getResources().getDisplayMetrics().ydpi;

dp是密度無關像素的意思,也被稱做dip,和px相比,它在不一樣密度的屏幕中的顯示比例將保持一致。 sp是可伸縮像素的意思,它採用了和dp一樣的設計理念,解決了文字大小的適配問題。

根據Android的規定,在160dpi的屏幕上,1dp等於1px,而在320dpi的屏幕上,1dp就等於2px。所以,使用dp來指定控件的寬和高,就能夠保證控件在不一樣密度的屏幕中的顯示比例保持一致。

4、自定義控件

繼承結構圖

全部控件都是直接或間接繼承自View的,全部佈局都是直接或間接繼承自ViewGroup的。View是Android中一種最基本的UI組件,它能夠在屏幕上繪製一塊矩形區域,並能響應這塊區域的各類事件,所以,咱們使用的各類控件其實就是在View的基礎之上又添加了各自特有的功能。而ViewGroup則是一種特殊的View,它能夠包含不少的子View和子ViewGroup,是一個用於放置控件和佈局的容器。

- android:background:爲佈局/控件指定背景圖。
- android:layout_margin:控件在上下左右偏移的距離。(android:layout_marginLeft類推)

一、引入佈局

寫好一個佈局文件,在另外的佈局文件中:

<include layout="@layout/title" />

二、自定義控件

寫一個專門的類

public class TitleLayout extends LinearLayout { 
	public TitleLayout(Context context, AttributeSet attrs) { 
		super(context, attrs); 
		LayoutInflater.from(context).inflate(R.layout.title, this); 
		Button titleBack = (Button) findViewById(R.id.title_back); 
		titleBack.setOnClickListener(new OnClickListener() { 
			@Override 
			public void onClick(View v) { 
				((Activity) getContext()).finish(); 
			} 
		}); 
	} 
}

重寫了LinearLayout中的帶有兩個參數的構造函數,在佈局中引入TitleLayout控件就會調用這個構造函數。而後在構造函數中須要對標題欄佈局進行動態加載,這就要藉助LayoutInflater來實現了。經過LayoutInflater的from()方法能夠構建出一個LayoutInflater對象,而後調用inflate()方法就能夠動態加載一個佈局文件,inflate()方法接收兩個參數,第一個參數是要加載的佈局文件的id,傳入R.layout.title,第二個參數是給加載好的佈局再添加一個父佈局,指定爲TitleLayout直接傳入this。在自定義的佈局中加入按鈕和按鈕的點擊事件。

在佈局文件中指明控件的完整類名,包名不可省略:

<com.example.uicustomviews.TitleLayout 
	android:layout_width="match_parent" 
	android:layout_height="wrap_content" >
</com.example.uicustomviews.TitleLayout>

代碼託管


學習進度條


代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 220/220 1/1 10/10
第二週 400/620 1/2 18/28
第三週 650/1120 1/3 12/40
第四周 1443/2563 1/4 12/52
第五週 3214/5777 1/5 20/72
第六週 33/5800 1/6 10/82
第七週 21/5800 1/7 10/92

參考資料


- 《Android Programming: The Big Nerd Ranch Guide(Android 編程:權威指南)》;

- 《Head First Android Development(深刻淺出Android 開發)》;

- 《Android 開發藝術探索》;

- 《Android 設計模式源碼分析》;

- 《Android 開發精要》;

- 《App 研發錄》。
相關文章
相關標籤/搜索