Android入門(二)Activity-Toast、Intent

来源:http://www.cnblogs.com/orlion/archive/2016/04/03/5350558.html
-Advertisement-
Play Games

原文鏈接:http://www.orlion.ga/427/ 一、隱藏activity的標題 在activity的java代碼的onCreate()方法中入requestWindowFeature(Window.FEATURE_NO_TITLE);如下: 二、在Activity中使用Toast 首先 ...


原文鏈接:http://www.orlion.ga/427/

一、隱藏activity的標題

    在activity的java代碼的onCreate()方法中入requestWindowFeature(Window.FEATURE_NO_TITLE);如下:

@Override
	public void onCreate(Bundle savedInstanceState){
		
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.first_layout);
	}

二、在Activity中使用Toast

    首先給button綁定點擊事件,然後在button被點擊時候彈出toast:

@Override
	public void onCreate(Bundle savedInstanceState){
		
		super.onCreate(savedInstanceState);
		
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.first_layout);
		
		// 點擊按鈕彈出Toast
		Button button1 = (Button) findViewById(R.id.button_1);
		button1.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v){
				Toast.makeText(FirstActivity.this, "You chick button 1" , Toast.LENGTH_SHORT).show(); 
			}
		});
	}

    解釋:在活動中,可以通過 findViewById()方法獲取到在佈局文件中定義的元素,這裡我們傳入 R.id.button_1,來得到按鈕的實例,這個值是剛纔在 first_layout.xml中通過 android:id屬性指定的。findViewById()方法返回的是一個 View對象,我們需要向下轉型將它轉成 Button對象。得到了按鈕的實例之後,我們通過調用 setOnClickListener()方法為按鈕註冊一個監聽器,點擊按鈕時就會執行監聽器中的 onClick()方法。因此,彈出 Toast的功能當然是要在nClick()方法中編寫了。

    Toast的用法非常簡單, 通過靜態方法makeText()創建出一個Toast對象, 然後調用show()將 Toast顯示出來就可以了。這裡需要註意的是,makeText()方法需要傳入三個參數。第一個參數是 Context,也就是 Toast要求的上下文,由於活動本身就是一個 Context對象,因此這裡直接傳入FirstActivity.this即可。 第二個參數是Toast顯示的文本內容, 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇 Toast.LENGTH_SHORT和 Toast.LENGTH_LONG。

 

    如果你需要在 XML中引用一個 id,就使用@id/id_name這種語法,而如果你需要在 XML中

定義一個 id,則要使用@+id/id_name這種語法。

 

三、使用Intent

    怎樣才能由主活動跳轉到其他活動呢?我們現在就來一起看一看。

    1、使用顯式Intent

    在 ActivityTest項目中再創建一個活動。新建一個 second_layout.xml佈局文件,代碼如下:

<?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_2"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:text="Button 2"/>
</LinearLayout>

    新建活動 SecondActivity繼承自Activity,代碼如下:

package ga.orlion.activitydemo1;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class SecondActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState){
		
		super.onCreate(savedInstanceState);
		
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.second_layout);
	}
}

    最後在 AndroidManifest.xml中為 SecondActivity進行註冊。

        <activity 
            android:name=".SecondActivity">
            
        </activity>

    

    由於 SecondActivity不是主活動,因此不需要配置<intent-filter>標簽里的內容,註冊活動的代碼也是簡單了許多。現在第二個活動已經創建完成,剩下的問題就是如何去啟動這第二個活動了,這裡我們需要引入一個新的概念,Intent。

    Intent是 Android程式中各組件之間進行交互的一種重要方式,它不僅可以指明當前組件想要執行的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啟動活動、啟動服務、以及發送廣播等場景,由於服務、廣播等概念你暫時還未涉及,麽本章我們的目光無疑就鎖定在了啟動活動上面。Intent的用法大致可以分為兩種,顯式 Intent和隱式 Intent,我們先來看一下顯式 Intent如何使用。

    Intent有多個構造函數的重載,其中一個是 Intent(Context packageContext, Class<?> cls)。這個構造函數接收兩個參數,第一個參數 Context要求提供一個啟動活動的上下文,第二個參數Class則是指定想要啟動的目標活動, 通過這個構造函數就可以構建出Intent的 “意圖” 。然後我們應該怎麼使用這個 Intent呢?Activity類中提供了一個 startActivity()方法, 這個方法是專門用於啟動活動的, 它接收一個Intent參數, 這裡我們將構建好的Intent傳入startActivity()

方法就可以啟動目標活動了。修改 FirstActivity中按鈕的點擊事件,代碼如下所示:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
    }
});

    我們首先構建出了一個Intent,傳入FirstActivity.this作為上下文,傳入SecondActivity.class作為目標活動,這樣我們的“意圖”就非常明顯了,即在 FirstActivity這個活動的基礎上打開 SecondActivity這個活動。然後通過 startActivity()方法來執行這個 Intent。重新運行程式,在 FirstActivity的界面點擊一下按鈕我們已經成功啟動 SecondActivity這個活動了。如果你想要回到上一個活動怎麼辦呢?很簡單,按下 Back鍵就可以銷毀當前活動,從而回到上一個活動了。使用這種方式來啟動活動,Intent的“意圖”非常明顯,因此我們稱之為顯式 Intent。

    2、使用隱式Intent

    相比於顯式 Intent,隱式 Intent則含蓄了許多,它並不明確指出我們想要啟動哪一個活

動, 而是指定了一系列更為抽象的action和category等信息, 然後交由系統去分析這個Intent,並幫我們找出合適的活動去啟動。什麼叫做合適的活動呢?簡單來說就是可以響應我們這個隱式 Intent的活動,那麼目前SecondActivity可以響應什麼樣的隱式 Intent呢?額,現在好像還什麼都響應不了,不過很快就會有了。通過在<activity>標簽下配置<intent-filter>的內容,可以指定當前活動能夠響應的 action和 category,打開 AndroidManifest.xml,添加如下代碼:

<activity android:name=".SecondActivity" >
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

    在<action>標簽中我們指明瞭當前活動可以響應 com.example.activitytest.ACTION_START這個 action,而<category>標簽則包含了一些附加信息,更精確地指明瞭當前的活動能夠響應的 Intent中還可能帶有的 category。只有<action>和<category>中的內容同時能夠匹配上 Intent中指定的 action和 category時,這個活動才能響應該 Intent。修改 FirstActivity中按鈕的點擊事件,代碼如下所示:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com.example.activitytest.ACTION_START");
        startActivity(intent);
    }
});

    可以看到,我們使用了 Intent的另一個構造函數,直接將 action的字元串傳了進去,表明我們想要啟動能夠響應 com.example.activitytest.ACTION_START這個 action的活動。那前面不是說要<action>和<category>同時匹配上才能響應的嗎?怎麼沒看到哪裡有指定category 呢?這是因為 android.intent.category.DEFAULT 是一種預設的 category,在調用startActivity()方法的時候會自動將這個 category添加到 Intent中。重新運行程式,在 FirstActivity的界面點擊一下按鈕,同樣成功啟動 SecondActivity了。

 

    3、使用Intent傳遞數據

    Intent還可以在啟動活動的時候傳遞數據的,我們來一起看一下。在啟動活動時傳遞數據的思路很簡單,Intent中提供了一系列 putExtra()方法的重載,可以把我們想要傳遞的數據暫存在 Intent中,啟動了另一個活動後,只需要把這些數據再從Intent中取出就可以了。比如說 FirstActivity中有一個字元串,現在想把這個字元串傳遞到SecondActivity中,你就可以這樣編寫:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        String data = "Hello SecondActivity";
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        intent.putExtra("extra_data", data);
        startActivity(intent);
    }
});

    這裡我們還是使用顯式 Intent的方式來啟動 SecondActivity,並通過 putExtra()方法傳遞了一個字元串。註意這裡putExtra()方法接收兩個參數,第一個參數是鍵,用於後面從 Intent中取值,第二個參數才是真正要傳遞的數據。然後我們在 SecondActivity中將傳遞的數據取出,並列印出來,代碼如下所示:

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.second_layout);
        Intent intent = getIntent();
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity", data);
    }
}

    首先可以通過 getIntent()方法獲取到用於啟動 SecondActivity 的 Intent,然後調用getStringExtra()方法,傳入相應的鍵值,就可以得到傳遞的數據了。這裡由於我們傳遞的是字元串,所以使用 getStringExtra()方法來獲取傳遞的數據,如果傳遞的是整型數據,則使用getIntExtra()方法,傳遞的是布爾型數據,則使用 getBooleanExtra()方法,以此類推。

    

    4、返回數據給上一個活動

    既然可以傳遞數據給下一個活動, 那麼能不能夠返回數據給上一個活動呢?答案是肯定的。不過不同的是,返回上一個活動只需要按一下 Back鍵就可以了,並沒有一個用於啟動活動 Intent來傳遞數據。通過查閱文檔你會發現,Activity中還有一個 startActivityForResult()方法也是用於啟動活動的, 但這個方法期望在活動銷毀的時候能夠返回一個結果給上一個活動。毫無疑問,這就是我們所需要的。startActivityForResult()方法接收兩個參數,第一個參數還是 Intent,第二個參數是請求碼,用於在之後的回調中判斷數據的來源。我們還是來實戰一下,修改 FirstActivity中按鈕的點擊事件,代碼如下所示:

button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivityForResult(intent, 1);
    }
});

    這裡我們使用了 startActivityForResult()方法來啟動 SecondActivity,請求碼只要是一個唯一值就可以了,這裡傳入了 1。接下來我們在 SecondActivity中給按鈕註冊點擊事件,併在點擊事件中添加返回數據的邏輯,代碼如下所示:

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.second_layout);
        Button button2 = (Button) findViewById(R.id.button_2);
        button2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return", "Hello FirstActivity");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

    可以看到,我們還是構建了一個 Intent,只不過這個 Intent僅僅是用於傳遞數據而已,它沒有指定任何的“意圖” 。緊接著把要傳遞的數據存放在 Intent中,然後調用了 setResult()方法。這個方法非常重要,是專門用於向上一個活動返回數據的。setResult()方法接收兩個參數,第一個參數用於向上一個活動返回處理結果,一般只使用 RESULT_OK 或RESULT_CANCELED這兩個值,第二個參數則是把帶有數據的 Intent傳遞迴去,然後調用了 finish()方法來銷毀當前活動。由於我們是使用startActivityForResult()方法來啟動 SecondActivity的, 在 SecondActivity被銷毀之後會回調上一個活動的onActivityResult()方法,因此我們需要在 FirstActivity中重寫這個方法來得到返回的數據,如下所示:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case 1:
        if (resultCode == RESULT_OK) {
            String returnedData = data.getStringExtra("data_return");
            Log.d("FirstActivity", returnedData);
        }
        break;
    default:
    }
}

    onActivityResult()方法帶有三個參數,第一個參數 requestCode,即我們在啟動活動時傳入的請求碼。 第二個參數 resultCode, 即我們在返回數據時傳入的處理結果。 第三個參數 data,即攜帶著返回數據的 Intent。由於在一個活動中有可能調用 startActivityForResult()方法去啟動很多不同的活動,每一個活動返回的數據都會回調到 onActivityResult()這個方法中,因此我們首先要做的就是通過檢查 requestCode 的值來判斷數據來源。確定數據是從SecondActivity返回的之後,我們再通過 resultCode的值來判斷處理結果是否成功。最後從data中取值並列印出來,這樣就完成了向上一個活動返回數據的工作。

    如果用戶在 SecondActivity中並不是通過點擊按鈕,而是通過按下Back鍵回到 FirstActivity,這樣數據不就沒法返回了嗎?沒錯,不過這種情況還是很好處理的,我們可以通過重寫 onBackPressed()方法來解決這個問題,代碼如下所示:

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("data_return", "Hello FirstActivity");
    setResult(RESULT_OK, intent);
    finish();
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • AngularJS $scope裡面的$watch(),$digest()和$apply()是AngularJS的核心函數,學習AngularJS必須理解這幾個函數。 在綁定$scope中的變數到view的時候,AngularJS自動在內部創建一個"Watch"。"Watch"用於監聽Angular ...
  • <a>元素的作用是可以創建一個鏈接,鏈接對應4個狀態:未訪問,已訪問,滑鼠懸停,滑鼠點擊瞬間。 為了給鏈接的4個狀態應用樣式,引入偽類的概念。 什麼是偽類呢?簡單點說,就是你沒定義這個類,但它確實作為一個類來使用。(這些類確實存在,瀏覽器在後臺會向這些類增加和刪除元素) 我在看《CSS設計指南》時, ...
  • 我們知道無論什麼時候只要創建了一個函數,就會為該函數創建一個prototype屬性,這個屬性指向函數的原型對象,預設情況下所有原型對象都會自動獲得一個constructor(構造函數)屬性,這個屬性包含了一個指向prototype屬性所在函數的指針。當調用構造函數創建一個新實例後,該實例內部就會包含 ...
  • 三欄式佈局是眾多網頁的常規佈局之一,我們在採用三欄式佈局時所提出的要求一般是左欄與右欄定寬,中間部分寬度自適應,中間部分作為內容主體,我們需要將其放在左欄與右欄之前來達到優先渲染的效果。 2006年Matthew Levine在《A LIST APART》上發表了一篇名為 "《In Search o ...
  • 前言:本篇隨筆會經常更新,隨著本人對佈局的深入學習,會不斷補充新的知識、新的使用技巧、新的認識等等。 1、Autoresizing(在代碼中使用) 先簡單的看看下麵的代碼,以及左邊運行出來的效果,然後後面就會對iPhone模擬器進行旋轉,再看看效果,然後結合代碼中的autoresizingMask屬 ...
  • 【原】博客園第三方客戶端-i博客園App開源 本文轉載請註明出處 —— polobymulberry-博客園 1.前言 目前i博客園App已經更新到2.0.0版本了,使用了最新的博客園Web API。相比於第一個版本,添加了很多新的功能,也修改了很多功能。整體來說改動比較大,代碼也比較混亂。所以趁著 ...
  • 在iOS中,JSON的常見解析方案有4種 第三方框架:JSONKit,SBJson,TouchJSON(性能從左到右,越差) 蘋果原生(自帶):NSJSONSerialization(性能最好) JSON與OC的轉換 JSON->OC對象 用這個類對第一個參數data進行json解析, 第二個參數: ...
  • 原文鏈接:http://www.orlion.ga/578/ Android系統中主要提供了三種方式用於簡單地實現數據持久化功能,即文件存儲、SharedPreference存儲以及資料庫存儲。當然,除了這三種方式之外,你還可以將數據保存在手機的 SD卡中,不過使用文件、SharedPreferen ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...