Android學習筆記之——Activity

之前博客《Android學習筆記之——Android Studio的安裝(3.6版本)、Java的基本語法及Android的概述》介紹過活動是所有Android應用程序的門面,凡是在應用中看得到的東西都是放在活動中的(也即與用戶交互,UI)

 

目錄

創建一個新的activity

創建和加載佈局

在AndroidManifest文件中註冊

在活動中使用Toast

在活動中使用Menu


 

創建一個新的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 來指定具體註冊哪一個活動

不過,僅僅是這樣註冊了活動,我們的程序仍然是不能運行的,因爲還沒有爲程序配置主活動,也就是說,當程序運行起來的時候,不知道要首先啓動哪個活動。

將文件修改如下:

  1. 首先,在<activity> 標籤的內部加入<intent-filter> 標籤,並在這個標籤裏添加<action android:name="android.intent.action.MAIN"/> 和<category android: name="android.intent.category.LAUNCHER" /> 這兩句聲明
  2. 使用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

            }
        });

    }
}

然後運行該程序有:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章