在上篇博文講解了Android的Activity這個元件的啟動流程後,接下來我們就來看看我們的Activity與我們的佈局檔案的關係吧
我們先來看看一個最簡單的佈局檔案的內容:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textSize="50sp" android:background="#00DD00" android:text="@string/hello_world" /> </RelativeLayout>
在這個佈局檔案裡面,我們在裡面定義了一個TextView控制元件,這個控制元件就是文字內容的顯示,我們可以給其指定各種屬性,例如高度、寬度、背景色等。在佈局檔案配置好以後,我們來看看Activity物件裡面的onCreate()方法中的內容:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
我們看到 setContentView(R.layout.activity_main);這裡我們就是載入了我們指定的那個佈局檔案,當執行完這句話以後,佈局檔案裡定義的所有的控制元件都會被載入進來,並且生成對應的View物件,說到View物件,我們要知道,我們定義的所有的控制元件,例如TextView、Button等等,這些都是View物件的子類。
我們知道,在佈局檔案被載入後,就會生成對應的控制元件物件,我們要如何在程式碼中得到該物件呢?可以通過 findViewById 這個方法,就可以根據ID找到我們需要的那個View物件了,例如我們要找到剛才的那個TextView物件:
private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); textView.setBackgroundColor(Color.GREEN); }
通過上面的 textView = (TextView) findViewById(R.id.textView);程式碼就可以得到我們佈局檔案中的TextView物件,因為所有的控制元件物件都是View的子類,而findViewById方法返回的是View型別的物件,所以我們這裡要對其進行向下型別轉換。在得到TextView這個物件後,我們就可以在java程式碼裡來設定其各個屬性。記住:在佈局檔案中能配置的內容,在java程式碼中也能設定,反之亦然。
在瞭解了這些之後,我們再來學一個知識點: 監聽器,相信做過java開發的都知道監聽器的概念,所以這裡也就不闡述了。我們這裡要實現的是通過給一個Button控制元件註冊監聽器,來處理一些操作。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="50sp" android:text="0" /> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="button" /> </LinearLayout>
這是我們的佈局檔案,裡面定義了一個TextView和一個Button,我們要做的就是當點選一下Button時,讓TextView的內容每次加1,當長按Button時,讓TextView的內容每次加2
public class MainActivity extends Activity { private TextView textView; private Button button; private int count = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); textView.setBackgroundColor(Color.GREEN); button = (Button) findViewById(R.id.button); // 給button物件註冊一個onClick監聽器 button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { count++; textView.setText(count + ""); } }); // 給button註冊一個onLongClick監聽器 button.setOnLongClickListener(new OnLongClickListener() { /** * 這個方法返回一個boolean值,如果返回true,則表示是一個長按的操作,會執行下面這個方法 * 如果返回false,則表示是一個點選操作,會首先執行完下面的方法,然後再執行點選的方法 */ @Override public boolean onLongClick(View arg0) { count += 2; textView.setText(count+""); return true; } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
這個就是我們的Activity的程式碼,我們首先要獲得TextView和Button這個物件,通過findViewById就可以獲得,然後給button註冊兩個監聽器,一個是OnclickListener,另一個是OnLongClickListener,然後我們這裡通過匿名內部類來得到實現了這兩個介面的物件,實現了其抽象方法。這樣我們就可以在方法裡面實現我們需要的操作了。