安卓入門-第三章-安卓常用控件的使用方式

  • 2020 年 2 月 19 日
  • 筆記

一、安卓常用控件的使用方式

1.1 TextView

 TextView可以說是Android中最簡單的一個控件了,你在前面其實已經和它打過一些交道了。它主要用於在界面上顯示一段文本信息,比如你在第1章看到的「Hello world!」。下面我們就來看一看關於TextView的更多用法。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:orientation="vertical"      android:layout_width="match_parent"      android:layout_height="match_parent">        <TextView          android:id="@+id/text_view"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:text="This is TextView" />    </LinearLayout>

 外面的LinearLayout先忽略不看,下面是上述XML英文組合的具體解釋:

英文組合

中文含義

android:id

控件的唯一標識符,用於被活動以R文件屬性的方式引用這個控件

android:layout_width

控件的寬度

android:layout_height

控件的高度

「match_parent」

讓當前控件的大小和父布局的大小一樣,也就是由父布局來決定當前控件的大小。如果父布局是View,那麼寬度就是和手機屏幕一樣的寬度。

「wrap_content」

讓當前控件的大小能夠剛好包含住裏面的內容,也就是由控件內容決定當前控件的大小。

android:text

TexyView控件內具體顯示的文本內容

android:gravity

控件內文字對齊方式

「center」

垂直和水平均居中,即效果等同於center_vertical:center_vertical

android:textSize=「24sp」

字體大小設置為24sp

android:textColor="#00ff00"

設置字體顏色為:"#00ff00"值

 接下來我們通過android:text 指定TextView中顯示的文本內容,現在運行程序,效果如圖3.1所示。

 雖然指定的文本內容正常顯示了,不過我們好像沒看出來TextView的寬度是和屏幕一樣寬的。其實這是由於TextView中的文字默認是居左上角對齊的,雖然TextView的寬度充滿了整個屏幕,可是由於文字內容不夠長,所以從效果上完全看不出來。現在我們修改TextView的文字對齊方式,如下所示:

 在中加入:android:gravity ="center"語句就將字符居中了。總結一下:我們使用android:gravity來指定文字的對齊方式,可選值有top 、bottom 、left 、right 、center 等,可以用「|」來同時指定多個值,這裡我們指定的center ,效果等同於center_vertical|center_horizontal ,表示文字在垂直和水平方向都居中對齊。現在重新運行程序,效果如圖3.2所示。

另外我們還可以對TextView中文字的大小和顏色進行修改,如下所示:

同樣地,在中加入:android:textSize="24sp"以及android:textColor="#00ff00"

當然TextView中還有很多其他的屬性,這裡就不再一一介紹了,用到的時候去查閱文檔就可以了。

1.2 Buttion

 Button是程序用於和用戶進行交互的一個重要控件,相信你對這個控件已經非常熟悉了,因為我們在上一章用了太多次Button。它可配置的屬性和TextView是差不多的,所以下標就給出一個不同的屬性設置方式:

英文組合

中文含義

android:textAllCaps=「false」

取消字體默認大寫的設置

 我們可以在activity_main.xml中這樣加入Button:

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

 雖然再xml配置文件中設置按鍵名為小寫,但是最終在design中顯示的卻是大寫的BUTTON,這是由於系統會對Button中的所有英文字母自動進行大寫轉換,如果這不是你想要的效果,可以使用如下配置來禁用這一默認特性:加入描述語句:android:textAllCaps="false"

 接下來我們可以在MainActivity中為Button的點擊事件註冊一個監聽器,如下所示:

public class MainActivity extends AppCompatActivity {        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          Button button = (Button) findViewById(R.id.button);          button.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  // 在此處添加邏輯              }          });      }  }

方式一的具體步驟:

當前活動繼承AppCompatActicity類 -> 重寫onCreate()方法 -> {調用引入布局方法:setContentView -> 使用findViewById方法根據R文件創建Buttion對象引用 -> Button對象調用setclickListener()方法,參數為重寫了Onclick方法的匿名內部類OnClickListener對象{在此編寫按鍵的內部執行邏輯}

 這樣每當點擊按鈕時,就會執行監聽器中的onClick() 方法,我們只需要在這個方法中加入待處理的邏輯就行了。如果你不喜歡使用匿名類的方式來註冊監聽器,也可以使用實現接口的方式來進行註冊,代碼如下所示:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          Button button = (Button) findViewById(R.id.button);          button.setOnClickListener(this);      }        @Override      public void onClick(View v) {          switch (v.getId()) {              case R.id.button:                  // 在此處添加邏輯                  break;              default:                  break;          }      }  }

方式二的具體步驟

當前活動繼承AppCompatActivity 以及實現了View.OnClickListener(這是定義在View類中的公共接口) -> 重寫onCreate()方法 -> {調用引入布局方法:setContentView -> 使用findViewById方法根據R文件創建Buttion對象引用 -> Button對象調用setclickListener()方法,參數為實現了View.OnClickListener接口的當前對象this } ->重寫onClick方法{在此添加案件的內部執行邏輯}

 這兩種寫法都可以實現對按鈕點擊事件的監聽,至於使用哪一種就全憑你的喜好了。

1.3 EditText

英文組合

中文含義

android:hint

小提示

android:maxLines

限制EditText控件的最大行數

 EditText是程序用於和用戶進行交互的另一個重要控件,它允許用戶在控件里輸入和編輯內容,並可以在程序中對這些內容進行處理。EditText的應用場景非常普遍,在進行發短訊、發微博、聊QQ等操作時,你不得不使用EditText。那我們來看一看如何在界面上加入EditText吧,修改activity_main.xml中的代碼,如下所示:

    <EditText          android:id="@+id/edit_text"          android:layout_width="match_parent"          android:layout_height="wrap_content"          />

 其實看到這裡,我估計你已經總結出Android控件的使用規律了,用法基本上都很相似:給控件定義一個id,再指定控件的寬度和高度,然後再適當加入一些控件特有的屬性就差不多了。

 所以使用XML來編寫界面其實一點都不難,完全可以不用藉助任何可視化工具來實現。現在重新運行一下程序,EditText就已經在界面上顯示出來了,並且我們是可以在裏面輸入內容的

 細心的你平時應該會留意到,一些做得比較人性化的軟件會在輸入框里顯示一些提示性的文字,然後一旦用戶輸入了任何內容,這些提示性的文字就會消失。這種提示功能在Android里是非常容易實現的,我們甚至不需要做任何的邏輯控制,因為系統已經幫我們都處理好了。修改activity_main.xml,如下所示:

 加入新的描述語句:android:hint="Type something here",其中hint就是暗示的意思,效果就是如下圖所示:

 可以看到,EditText中顯示了一段提示性文本,然後當我們輸入任何內容時,這段文本就會自動消失。

 不過,隨着輸入的內容不斷增多,EditText會被不斷地拉長。這時由於EditText的高度指定的是wrap_content ,因此它總能包含住裏面的內容,但是當輸入的內容過多時,界面就會變得非常難看。我們可以使用android:maxLines 屬性來解決這個問題,修改activity_main.xml,如下所示:

加入描述性語句:

android:maxLines="2"

 這裡通過android:maxLines 指定了EditText的最大行數為兩行,這樣當輸入的內容超過兩行時,文本就會向上滾動,而EditText則不會再繼續拉伸。

 我們還可以結合使用EditText與Button來完成一些功能,比如通過點擊按鈕來獲取EditText中輸入的內容。修改MainActivity中的代碼,如下所示:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {        private EditText editText;        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          Button button = (Button) findViewById(R.id.button);          editText = (EditText) findViewById(R.id.edit_text);          button.setOnClickListener(this);      }        @Override      public void onClick(View v) {          switch (v.getId()) {              case R.id.button:                  String inputText = editText.getText().toString();                  Toast.makeText(MainActivity.this, inputText,                  Toast.LENGTH_SHORT).show();                  break;              default:                  break;          }      }    }

 首先通過findViewById()方法得到EditText的實例,然後在按鈕的點擊事件里調用EditText的getText()方法獲取到輸入的內容,再調用toString()方法轉換成字符串,最後還是老方法,使用Toast將輸入的內容顯示出來。

 重新運行程序,在EditText中輸入一段內容,然後點擊按鈕,效果如下圖所示。

1.4 ImageView

英文組合

中文含義

android:src

指定文件的源,比如說一張圖片對應的源

imageView.setImageResource(R.drawable.img_2);

源路徑是可以通過活動中的方法修改的,那麼一來可能就會導致改變顯示的圖片

 ImageView是用於在界面上展示圖片的一個控件,它可以讓我們的程序界面變得更加豐富多彩。學習這個控件需要提前準備好一些圖片,圖片通常都是放在以「drawable」開頭的目錄下的。目前我們的項目中有一個空的drawable目錄,不過由於這個目錄沒有指定具體的分辨率,所以一般不使用它來放置圖片。這裡我們在res目錄下新建一個drawable-xhdpi目錄,然後將事先準備好的兩張圖片img_1.png和img_2.png複製到該目錄當中。

 接下來修改activity_main.xml,如下所示,加入一下語句:

    <ImageView          android:id="@+id/image_view"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:src="@drawable/img_1"          />

 可以看到,這裡使用android:src 屬性給ImageView指定了一張圖片。由於圖片的寬和高都是未知的,所以將ImageView的寬和高都設定為wrap_content ,這樣就**保證了不管圖片的尺寸是多少,圖片都可以完整地展示出來。**重新運行程序,效果如下圖所示:

 我們還可以在程序中通過代碼動態地更改ImageView中的圖片,然後修改MainActivity的代碼,如下所示:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {        private EditText editText;        private ImageView imageView;        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          Button button = (Button) findViewById(R.id.button);          editText = (EditText) findViewById(R.id.edit_text);          imageView  = (ImageView) findViewById(R.id.image_view);          button.setOnClickListener(this);      }        @Override      public void onClick(View v) {          switch (v.getId()) {              case R.id.button:                  imageView.setImageResource(R.drawable.img_2);                  break;              default:                  break;          }      }    }

 在按鈕的點擊事件里,通過調用ImageView的setImageResource()方法將顯示的圖片改成img_2,現在重新運行程序,然後點擊一下按鈕,就可以看到ImageView中顯示的圖片改變了。

1.5 ProgressBar以及控件的可見性

英文組合

中文含義

android:visibility

控制文件的可見性,有不可見佔大小、不可見不佔大小、可見等分類

setVisibility()

活動中控制可見性的方法,傳入數據為:View.VISIBLE 、View.INVISIBLE 和View.GONE

style

控制進度條的格式,默認的進度條為動態的環形,可以改為拖動條

android:max

用於給拖動條設置最大大小,調用活動的方法時就能改變拖動條的當前值,達到最大值時,拖動條相當於就到了100%

 ProgressBar用於在界面上顯示一個進度條,表示我們的程序正在加載一些數據。它的用法也非常簡單,修改activity_main.xml中的代碼,如下所示:

<ProgressBar          android:id="@+id/progress_bar"          android:layout_width="match_parent"          android:layout_height="wrap_content"          />

 這時你可能會問,旋轉的進度條表明我們的程序正在加載數據,那數據總會有加載完的時候吧?如何才能讓進度條在數據加載完成時消失呢?這裡我們就需要用到一個新的知識點:**Android控件的可見屬性。**所有的Android控件都具有這個屬性,可以通過android:visibility 進行指定,可選值有3種:visible 、invisible 和gone 。

  1. visible 表示控件是可見的,這個值是默認值,不指定android:visibility 時,控件都是可見的。
  2. invisible 表示控件不可見,但是它仍然佔據着原來的位置和大小,可以理解成控件變成透明狀態了。
  3. gone 則表示控件不僅不可見,而且不再佔用任何屏幕空間。

 我們還可以通過代碼來設置控件的可見性,使用的是setVisibility() 方法,可以傳入View.VISIBLE 、View.INVISIBLE 和View.GONE 這3種值。

    @Override      public void onClick(View v) {          switch (v.getId()) {              case R.id.button:                  if(imageView.getVisibility() == View.INVISIBLE){                      imageView.setVisibility(View.VISIBLE);                  }else{                      imageView.setVisibility(View.INVISIBLE);                  }                  break;              default:                  break;          }      }

 通過以上代碼就可以通過按鈕點擊事件來控制圖片的顯示或不現實,當然此處的代碼實現的是不釋放原來所佔空間的隱藏實現方式。

 另外,我們還可以給ProgressBar指定不同的樣式,剛剛是圓形進度條,通過style 屬性可以將它指定成水平進度條,修改activity_main.xml中的代碼,如下所示:

style="?android:attr/progressBarStyleHorizontal"  android:max="100"

 指定成水平進度條後,我們還可以通過android:max 屬性給進度條設置一個最大值,然後在代碼中動態地更改進度條的進度。修改MainActivity中的代碼,如下所示:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {        ...        @Override      public void onClick(View v) {          switch (v.getId()) {              case R.id.button:                  int progress = progressBar.getProgress();                  progress = progress + 10;                  progressBar.setProgress(progress);                  break;              default:                  break;          }      }    }

1.6 AlertDialog

 AlertDialog可以在當前的界面彈出一個對話框,這個對話框是置頂於所有界面元素之上的,能夠屏蔽掉其他控件的交互能力,因此AlertDialog一般都是用於**提示一些非常重要的內容或者警告信息。**比如為了防止用戶誤刪重要內容,在刪除前彈出一個確認對話框。下面我們來學習一下它的用法,修改MainActivity中的代碼,如下所示:

    @Override      public void onClick(View v) {          switch (v.getId()) {              case R.id.button:                  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) {                          Toast.makeText(MainActivity.this,"You clicked OK",Toast.LENGTH_SHORT).show();                      }                  });                  dialog.setNegativeButton("Cancel", new DialogInterface.                          OnClickListener() {                      @Override                      public void onClick(DialogInterface dialog, int which) {                          Toast.makeText(MainActivity.this,"You clicked Cancel",Toast.LENGTH_SHORT).show();                        }                  });                  dialog.show();                  break;              default:                  break;          }      }

代碼的分析:如上點擊警告欄只是在做了打印出相關Toast提示。

  1. 首先通過AlertDialog.Builder創建一個AlertDialog的實例
  2. 然後可以為這個對話框設置標題、內容、可否用Back鍵關閉對話框等屬性
  3. 接下來調用setPositiveButton() 方法為對話框設置確定按鈕的點擊事件(對應於確定OK按鍵)
  4. 調用setNegativeButton() 方法設置取消按鈕的點擊事件(對應於Cancel按鍵)
  5. 最後調用show() 方法將對話框顯示出來。重新運行程序

1.7 ProgressDialog

 ProgressDialog和AlertDialog有點類似,都可以在界面上彈出一個對話框,都能夠屏蔽掉其他控件的交互能力。不同的是,ProgressDialog會在對話框中顯示一個進度條,一般用於表示當前操作比較耗時,讓用戶耐心地等待。它的用法和AlertDialog也比較相似,修改MainActivity中的代碼,如下所示:

    @Override      public void onClick(View v) {          switch (v.getId()) {              case R.id.button:                  ProgressDialog progressDialog = new ProgressDialog                          (MainActivity.this);                  progressDialog.setTitle("This is ProgressDialog");                  progressDialog.setMessage("Loading...");                  progressDialog.setCancelable(true);                  progressDialog.show();                  break;              default:                  break;          }      }

 可以看到,這裡也是先構建出一個ProgressDialog 對象,然後同樣可以設置標題、內容、可否取消等屬性,最後也是通過調用show()方法將ProgressDialog顯示出來。重新運行程序,點擊按鈕後,效果如下圖所示。

 注意,如果在setCancelable() 中傳入了false ,表示ProgressDialog是不能通過Back鍵取消掉的,這時你就一定要在代碼中做好控制,當數據加載完成後必須要調用ProgressDialog的dismiss() 方法來關閉對話框,否則ProgressDialog將會一直存在。

 好了,關於Android常用控件的使用,我要講的就只有這麼多。一節內容就想覆蓋Android控件所有的相關知識不太現實,同樣一口氣就想學會所有Android控件的使用方法也不太現實。本節所講的內容對於你來說只是起到了一個引導的作用,你還需要在以後的學習和工作中不斷地摸索,通過查閱文檔以及網上搜索的方式學習更多控件的更多用法。當然,當本書後面涉及一些我們前面沒學過的控件和相關用法時,我仍然會在相應的章節做詳細的講解。