之前博客《Android學習筆記之——Android Studio的安裝(3.6版本)、Java的基本語法及Android的概述》介紹過活動是所有Android應用程序的門面,凡是在應用中看得到的東西都是放在活動中的(也即與用戶交互,UI)
目錄
創建一個新的activity
由於Android Studio在一個工作區間內只允許打開一個項目,因此首先需要將當前的項目關閉,點擊導航欄File→Close Project。
然後再新建一個Android項目,在此處,不再選擇Empty Activity這個選項,而是選擇Add No Activity,因爲這次我們準備手動創建活動
項目名可以叫作ActivityTest,包名我們就使用默認值com.example.activitytest
點擊Finish,等待Gradle構建完成後,項目就創建成功了。
項目創建成功後,仍然會默認使用Android模式的項目結構,這裏手動改成Project模式
雖然Android studio會自動生成很多文件,但是,app/src/main/java/com.example.activitytest目錄應該是空的了
現在右擊com.example.activitytest包→New→Activity→Empty Activity
將活動命名爲FirstActivity,並且不要勾選Generate Layout File和Launcher Activity這兩個選項,如下圖所示。
- 勾選Generate Layout File表示會自動爲FirstActivity創建一個對應的佈局文件,
- 勾選Launcher Activity表示會自動將FirstActivity設置爲當前項目的主活動,
項目中的任何活動都應該重寫Activity的onCreate() 方法,而目前的FirstActivity中已經重寫了這個方法,這是由Android Studio自動幫我們完成的,代碼如下所示:
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
創建和加載佈局
Android程序的設計講究邏輯和視圖分離,最好每一個活動都能對應一個佈局,佈局就是用來顯示界面內容的,因此我們現在就來手動創建一個佈局文件。
右擊app/src/main/res目錄→New→Directory
會彈出一個新建目錄的窗口,
這裏先創建一個名爲layout的目錄。然後對着layout目錄右鍵→New→Layout resource file
我們將這個佈局文件命名爲first_layout,根元素就默認選擇爲LinearLayout
這是Android Studio爲我們提供的可視化佈局編輯器,你可以在屏幕的中央區域預覽當前的佈局。
先來看看text部分
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
由於我們剛纔在創建佈局文件時選擇了LinearLayout作爲根元素,因此現在佈局文件中已經有一個LinearLayout元素了。那我們現在對這個佈局稍做編輯,添加一個按鈕,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button_1" //給當前的元素定義一個唯一標識符,之後可以在代碼中對這個元素進行操
//如果你需要在XML中引用一個id ,就使用@id/id_name 這種語法
//而如果你需要在XML中定義一個id ,則要使用@+id/id_name 這種語法
android:layout_width="match_parent" //指定了當前元素的寬度(這裏選擇與父元素一樣寬)
android:layout_height="wrap_content" //指定了當前元素的高度(這裏表示當前元素的高度只要能剛好包含裏面的內容就行)
android:text="Button 1" //元素中顯示的文字內容
/>
</LinearLayout>
創建完佈局後,在onCreate() 方法中加入如下代碼,來加載這個佈局:
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通過文件名字來調用
//setContentView方法用於加載佈局
//項目中添加的任何資源都會在R文件中生成一個相應的資源id
// 因此,所創建的layout文件會自動將id添加到R文件中
// 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id
}
}
在AndroidManifest文件中註冊
之前博客《Android學習筆記之——Android Studio的安裝(3.6版本)、Java的基本語法及Android的概述》介紹過,所有的活動都要在AndroidManifest.xml中進行註冊才能生效,而實際上FirstActivity已經在AndroidManifest.xml中註冊過了,我們打開app/src/main/AndroidManifest.xml文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity"></activity>
</application>
</manifest>
活動的註冊聲明要放在<application> 標籤內,這裏是通過<activity> 標籤來對活動進行註冊的。
在<activity> 標籤中我們使用了android:name 來指定具體註冊哪一個活動
不過,僅僅是這樣註冊了活動,我們的程序仍然是不能運行的,因爲還沒有爲程序配置主活動,也就是說,當程序運行起來的時候,不知道要首先啓動哪個活動。
將文件修改如下:
- 首先,在<activity> 標籤的內部加入<intent-filter> 標籤,並在這個標籤裏添加<action android:name="android.intent.action.MAIN"/> 和<category android: name="android.intent.category.LAUNCHER" /> 這兩句聲明
- 使用android:label 指定活動中標題欄的內容,標題欄是顯示在活動最頂部的。需要注意的是,給主活動指定的label不僅會成爲標題欄中的內容,還會成爲啓動器(Launcher)中應用程序顯示的名稱。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity">
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
這樣的話,FirstActivity就成爲我們這個程序的主活動了,即點擊桌面應用程序圖標時首先打開的就是這個活動。另外需要注意,如果你的應用程序中沒有聲明任何一個活動作爲主活動,這個程序仍然是可以正常安裝的,只是你無法在啓動器中看到或者打開這個程序。這種程序一般都是作爲第三方服務供其他應用在內部進行調用的,如支付寶快捷支付服務。
運行“shift+F10”
在活動中使用Toast
Toast是Android系統提供的一種非常好的提醒方式,在程序中可以使用它將一些短小的信息通知給用戶,這些信息會在一段時間後自動消失,並且不會佔用任何屏幕空間。
接下來實現功能爲點擊button1就會出現toast。在onCreate()中添加如下代碼:
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
//setContentView方法用於加載佈局
//項目中添加的任何資源都會在R文件中生成一個相應的資源id
// 因此,所創建的layout文件會自動將id添加到R文件中
// 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id
///////////**********************///////////////
Button button1=(Button) findViewById(R.id.button_1);
//通過findViewById() 方法獲取到在佈局文件中定義的元素
//在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
//findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象
button1.setOnClickListener(new View.OnClickListener() {
//通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
//點擊按鈕時就會執行監聽器中的onClick() 方法。
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
//通過靜態方法makeText() 創建出一個Toast對象
//並通過show()將Toast顯示出來
// makeText() 方法需要傳入3個參數。
// 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
// 第二個參數是Toast顯示的文本內容,
// 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
}
});
}
}
在活動中使用Menu
在大多數的app界面都會有幾個點的菜單鍵。本節介紹一下怎麼創建菜單鍵
首先在res目錄下新建一個menu文件夾,右擊res目錄→New→Directory,輸入文件夾名menu,點擊OK。
接着在這個文件夾下再新建一個名叫main的菜單文件,右擊menu文件夾→New→Menu resource file
然後在main.xml中添加如下代碼:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
//此處創建兩個菜單選項
<item //用來創建具體的某一個菜單項
android:id="@+id/add_item" //給該菜單項指定一個唯一的標識符
android:title="Add"/> //該菜單的名稱
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
然後回到FirstActivity中對onCreateOptionsMenu()方法進行重寫。通過輸入“ctrl+O”可以啓動:
然後將方法重寫
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends AppCompatActivity {
//重寫onCreateOptionsMenu方法,將菜單顯示出來
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通過getMenuInflater() 方法能夠得到MenuInflater 對象
//再調用它的inflate() 方法就可以給當前活動創建菜單了
//inflate() 方法接收兩個參數,
//第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
//第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。
return true;
//返回true ,表示允許創建的菜單顯示出來
//若返回了false ,創建的菜單將無法顯示。
}
//重寫onOptionsItemSelected方法,定義菜單的相應事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
////////////////////////////////////////************************************///////
//定義佈局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
//setContentView方法用於加載佈局
//項目中添加的任何資源都會在R文件中生成一個相應的資源id
// 因此,所創建的layout文件會自動將id添加到R文件中
// 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id
///////////**********************///////////////
Button button1=(Button) findViewById(R.id.button_1);
//通過findViewById() 方法獲取到在佈局文件中定義的元素
//在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
//findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象
button1.setOnClickListener(new View.OnClickListener() {
//通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
//點擊按鈕時就會執行監聽器中的onClick() 方法。
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
//通過靜態方法makeText() 創建出一個Toast對象
//並通過show()將Toast顯示出來
// makeText() 方法需要傳入3個參數。
// 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
// 第二個參數是Toast顯示的文本內容,
// 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
}
});
}
}
然後運行該程序有: