亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Android Developers Training】 4. 啟動另一

系統 2132 0

注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。

原文鏈接: http://developer.android.com/training/basics/firstapp/starting-activity.html


?一. 啟動另一個Activity

在完成了之前的課程后,你已經擁有了一個顯示一個Activity(即只有一個屏幕畫面)的應用,在這個Activity中有一個文本框和一個按鈕。在這節課上,你將在 MainActivity 中添加一些新的代碼,這些代碼將實現:當用戶點擊按鈕后,可以啟動一個新的Activity。

?

一). 發送按鈕的響應

為了響應按鈕點擊事件,打開布局文件 activity_main.xml ,在 <Button> 標簽中,添加 android:onClick 這一屬性字段:

      
        <
      
      
        Button

    
      
      
        android:layout_width
      
      
        ="wrap_content"
      
      
        

    android:layout_height
      
      
        ="wrap_content"
      
      
        

    android:text
      
      
        ="@string/button_send"
      
      
        

    android:onClick
      
      
        ="sendMessage"
      
      
        />
      
    

android:onClick 的值為“ sendMessage ”,它在你的 Activity 中的一個方法的名字,當用戶點擊這個按鈕時,系統會調用這個方法。

打開 MainActivity 類(在項目工程的 /src 目錄下),然后添加響應的方法:

      
        /**
      
      
         Called when the user clicks the Send button 
      
      
        */
      
      
        public
      
      
        void
      
      
         sendMessage(View view) {

    
      
      
        //
      
      
         Do something in response to button
      
      

}
    

這需要你導入 View 類:

      
        import
      
       android.view.View;
    

Tip:

在Eclipse中,按下“ Ctrl + Shift + O ”可以自動導入丟失的類(在Mac上的組合鍵是:“ Cmd + Shift + O ”)。

為了讓系統能夠將這個方法和它在 android:onClick 屬性字段中的方法名這兩者相互關聯起來,這個方法的特征必須嚴格地像上述所表示的那樣,具體來說,方法的特征有如下幾點:

  • 必須是 Public
  • 返回值為 void
  • 只有一個形參 View (這個 View 就是被點擊的 View

接下來,你將會實現這個方法,我們用它來讀取文本框中的內容并且將文字發送給另一個 Activity

?

二). 構建一個Intent

Intent 是一種對象,它是在運行時將兩個獨立的組件(比如兩個 Activity )聯系起來的紐帶。 Intent 代表了一個應用的某種“意圖”,你可以使用Intent去完成很多事情,但通常他們被用來啟動另一個Activity。

sendMessage() 這一方法中,創建一個新的 Intent 來啟動另一個稱之為 DisplayMessageActivity 的Activity:

      Intent intent = 
      
        new
      
       Intent(
      
        this
      
      , DisplayMessageActivity.
      
        class
      
      );
    

這里的構造函數包含了兩個參數:

  • 一個 Context 作為第一個參數(這里用 this 的原因是 Activity Context 的一個子類)。
  • 應用組件中的某個 Class ,它是系統送達 Intent 的目標(在此例中,對應的是將要被啟動的 Activity

Note:

若你正在使用的是一個集成開發環境(IDE),如:Eclipse,那么對 DisplayMessageActivity 的引用將會引起一個錯誤,原因是目前這個類還并不存在。我們現在先暫且忽略這個錯誤,你馬上就將創建這個類。

一個 Intent 不僅僅只能允許你啟動另一個 Activity ,它還能附帶有一些數據給這個 Activity ,在 sendMessage() 這一方法中,使用 findViewById() 這個方法來獲取 EditText 控件,并把它的內容交給Intent:

      Intent intent = 
      
        new
      
       Intent(
      
        this
      
      , DisplayMessageActivity.
      
        class
      
      
        );

EditText editText 
      
      =
      
         (EditText) findViewById(R.id.edit_message);

String message 
      
      =
      
         editText.getText().toString();

intent.putExtra(EXTRA_MESSAGE, message);
      
    

Note:

你現在需要導入一些聲明: android.content.Intent android.widget.EditText 。稍后你將會定義 EXTRA_MESSAGE 常量。

將Intent發送給其他應用:

這節課中所創建的 Intent ,我們將它稱之為“顯式的 Intent ”,因為這個 Intent 指明了自己將會發送給哪一個特定的應用組件。然而, Intent 也可以是 隱式的 ”,在這種情況下, Intent 不指明自己期望被發送到哪個組件,但允許任何安裝在設備上的應用響應這個 Intent ,只要它的行為的元數據規格與之相匹配,可以通過閱讀 Interacting with Other Apps 獲得更多信息。

一個 Intent 攜帶以鍵值對形式存放的各種數據類型,在 Intent 中這些鍵值對被稱之為 extras putExtra() 方法中第一個參數對應于鍵,第二個參數對應于值。

為了讓下一個 Activity 可以查詢 extras 的數據,你應該使用一個公共常量來定義 Intent extras 中的鍵。所以在 MainActivity 類的頂端,添加 EXTRA_MESSAGE 的定義:

      
        public
      
      
        class
      
       MainActivity 
      
        extends
      
      
         Activity {

    
      
      
        public
      
      
        final
      
      
        static
      
       String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"
      
        ;

    ...

}
      
    

Intent extras 的鍵定義時,將你應用的包名作為前綴是一個好的習慣,這樣可以保證他們是唯一的,這有助于你的應用和其他應用進行通信。

?

三). 啟動第二個Activity

為了啟動一個 Activity ,調用 startActivity() 方法,并且將你的 Intent 對象傳遞給它。之后系統接受到函數的調用,并且啟動一個被 Intent 所指定的 Activity 實例。

加上了新的代碼后,被Send按鈕所調用的 sendMessage() 方法的完整代碼如下所示:

      
        /**
      
      
         Called when the user clicks the Send button 
      
      
        */
      
      
        public
      
      
        void
      
      
         sendMessage(View view) {

    Intent intent 
      
      = 
      
        new
      
       Intent(
      
        this
      
      , DisplayMessageActivity.
      
        class
      
      
        );

    EditText editText 
      
      =
      
         (EditText) findViewById(R.id.edit_message);

    String message 
      
      =
      
         editText.getText().toString();

    intent.putExtra(EXTRA_MESSAGE, message);

    startActivity(intent);

}
      
    

現在你需要創建 DisplayMessageActivity 類使得它能夠正確運行。

?

四). 創建第二個Activity

使用Eclipse創建第二個類:

  1. 在工具欄中點擊“ New
  2. 在出現的窗口中,打開 Android ”文件夾,選擇 Android Activity ”,點擊 Next
  3. 選擇 BlankActivity 點擊 Next
  4. 填寫Activity的細節信息:
    • Project : MyFirstApp
    • Activity Name : DisplayMessageActivity
    • Layout Name : activity_display_message
    • Title : My Message
    • Hierarchial Parent : com.example.myfirstapp.MainActivity
    • Navigation Type : None

點擊 Finish

圖1. Eclipse中創建新Activity的向導

如果你使用的是不同的IDE,或者是命令行,在項目工程中的 src/ ”創建一個新的名為“ DisplayMessageActivity.java ”的文件,這個文件緊隨最初的 MainActivity.java 文件。

打開 DisplayMessageActivity.java ”,如果你使用的是Eclipse創建的它:

  • 這個類已經包含了一個必須的 onCreate() 方法的實現
  • 同時還有 onCreateOptionsMenu() 方法的實現,但在這個應用中我們不需要它,所以你可以將它刪除
  • 同時還有一個 onOptionsItemSelected() 方法的實現,這個方法處理標題欄( Action Bar )的處理上一頁( Up )事件時的行為。我們保持它原有的樣子。

因為 ActionBar 的APIs僅在 HONEYCOMB (API Level 11)及更高的版本中才有,所以你必須在 getActionBar() 方法處添加一個條件判斷,用來檢查當前的平臺版本。另外,你必須在 onCreate() 方法處添加一個標簽:“ @SuppressLint("NewApi") ”,以此來避免 lint 錯誤。

現在, DisplayMessageActivity 看上去應該是這樣的

      
        public
      
      
        class
      
       DisplayMessageActivity 
      
        extends
      
      
         Activity {



    @SuppressLint(
      
      "NewApi"
      
        )

    @Override

    
      
      
        protected
      
      
        void
      
      
         onCreate(Bundle savedInstanceState) {

        
      
      
        super
      
      
        .onCreate(savedInstanceState);

        setContentView(R.layout.activity_display_message);



        
      
      
        //
      
      
         Make sure we're running on Honeycomb or higher to use ActionBar APIs
      
      
        if
      
       (Build.VERSION.SDK_INT >=
      
         Build.VERSION_CODES.HONEYCOMB) {

            
      
      
        //
      
      
         Show the Up button in the action bar.
      
      

            getActionBar().setDisplayHomeAsUpEnabled(
      
        true
      
      
        );

        }

    }



    @Override

    
      
      
        public
      
      
        boolean
      
      
         onOptionsItemSelected(MenuItem item) {

        
      
      
        switch
      
      
         (item.getItemId()) {

        
      
      
        case
      
      
         android.R.id.home:

            NavUtils.navigateUpFromSameTask(
      
      
        this
      
      
        );

            
      
      
        return
      
      
        true
      
      
        ;

        }

        
      
      
        return
      
      
        super
      
      
        .onOptionsItemSelected(item);

    }

}
      
    

如果你使用的IDE不是Eclipse,使用上述代碼更新你的 DisplayMessageActivity 類。

所有 Activity 的子類必須實現 onCreate() 方法。當系統創建Activity的實例時,會調用這個方法。在這個方法中,你通過使用 setContentView() 方法定義 activity 的的布局,同時對 activity 的組件進行初始化設置。

Note:

如果你使用的IDE不是Eclipse,你的項目工程將不會包括 setContentView() 所需要的布局文件 activity_display_message,這沒有關系,因為你馬上將會對這個方法進行更新并且不再需要這個布局。

?

添加標題字符

如果你使用的是Eclipse,你可以跳過這一節,因為自動創建的模板為新的 activity 提供了標題字符。

如果你使用的IDE不是Eclipse,在“ strings.xml ”添加新 activity 的標題字符:

      
        <
      
      
        resources
      
      
        >
      
      
        

    ...

    
      
      
        <
      
      
        string 
      
      
        name
      
      
        ="title_activity_display_message"
      
      
        >
      
      My Message
      
        </
      
      
        string
      
      
        >
      
      
        </
      
      
        resources
      
      
        >
      
    

?

添加至清單

在你的清單文件 AndroidManifest.xml 中,所有 activity 必須通過使用一個 <activity> 標簽 被聲明。

當你使用Eclipse工具創建這個activity時,它會創建一個默認的條目,如果你使用的不是Eclipse,你需要自己添加這個清單條目,修改后的結果如下:

      
        <
      
      
        application 
      
      
        ... 
      
      
        >
      
      
        

    ...

    
      
      
        <
      
      
        activity

        
      
      
        android:name
      
      
        ="com.example.myfirstapp.DisplayMessageActivity"
      
      
        

        android:label
      
      
        ="@string/title_activity_display_message"
      
      
        

        android:parentActivityName
      
      
        ="com.example.myfirstapp.MainActivity"
      
      
        >
      
      
        <
      
      
        meta-data

            
      
      
        android:name
      
      
        ="android.support.PARENT_ACTIVITY"
      
      
        

            android:value
      
      
        ="com.example.myfirstapp.MainActivity"
      
      
        />
      
      
        </
      
      
        activity
      
      
        >
      
      
        </
      
      
        application
      
      
        >
      
    

其中 android:parentActivityName 屬性字段聲明了在應用的邏輯結構中該 activity 的父 activity的名字。系統使用這一屬性值來實現默認的導航行為,比如在Android 4.1版本(API Level 16)或更高版本中的 Up navigation 行為。你可以為較舊版本的Android系統提供相同的導航行為,這可以通過使用 Support Library 并且添加 <meta-data> 標簽來實現,如同此例所示。

? Note:

你的Android SDK應該已經擁有了最新的 Android Support Library,它包含在ADT中。但如果你用的是其他的IDE,你應該在 Adding Platforms and Packages 這一步中已經將它安裝好。當在Eclipse中使用模板時,Support Library就被自動地添加到你的項目中了(你可以在 Android Dependencies 下看到這個庫的JAR文件)。如果你使用的不是Eclipse,你需要手動將它添加至你的項目,按照如下導引一步步執行即可: setting up the Support Library

如果你使用的是Eclipse,你現在已經可以運行這個應用了,但是沒有什么事情發生。點擊發送按鈕會啟動第二個 Activity ,但是它使用的是默認的“ Hello World ”模板作為布局。你很快就將更新這個activity,使它顯示一個自定義的文本框,若你使用的是其他IDE,不用擔心目前自己應用還無法編譯的問題。

?

?

五).?接受Intent

無論用戶是如何被指引到那兒的,每個 Activity 都是被一個 Intent 啟動的。你可以通過調用 getIntent() 方法來獲得啟動你的 activity Intent ,進而收回它所攜帶的數據。

DisplayMessageActivity 類中的的 onCreate() 方法里,提取由 MainActivity發送的數據:

      Intent intent =
      
         getIntent();

String message 
      
      = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    

?

六). 顯示消息

為了在屏幕上顯示消息,創建一個 TextView 控件,然后使用 setText() 方法設置它要顯示的文本。之后將 TextView 傳遞給 setContentView() ,這樣 TextView 就成為了這個activity的根View。

DisplayMessageActivity onCreate() 方法的完整代碼如下:

      
        @Override


      
      
        public
      
      
        void
      
      
         onCreate(Bundle savedInstanceState) {

    
      
      
        super
      
      
        .onCreate(savedInstanceState);



    
      
      
        //
      
      
         Get the message from the intent
      
      

    Intent intent =
      
         getIntent();

    String message 
      
      =
      
         intent.getStringExtra(MainActivity.EXTRA_MESSAGE);



    
      
      
        //
      
      
         Create the text view
      
      

    TextView textView = 
      
        new
      
       TextView(
      
        this
      
      
        );

    textView.setTextSize(
      
      40
      
        );

    textView.setText(message);



    
      
      
        //
      
      
         Set the text view as the activity layout
      
      
            setContentView(textView);

}
      
    

現在你可以運行這個應用。當它打開后,在文本框里輸入一些文字,點擊發送,然后這些文字將會在第二個 activity 中顯示出來。

圖2. 在Android4.0設備上的運行結果

?

就是這樣,你已經構建好了你的第一個應用了!

【Android Developers Training】 4. 啟動另一個Activity


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人99国产精品 | 女人18毛片a级毛片免费看一 | 精品自拍视频在线观看 | 日日夜人人澡人人澡人人看免 | 亚洲精品第四页中文字幕 | 俄罗斯一级成人毛片 | 在线国产网站 | 99久久99久久精品免费看子 | 鲁鲁狠色综合色综合网站 | 成人免费久久精品国产片久久影院 | 国产成人精品s8sp视频 | 日本一区二区三区免费在线观看 | 亚洲国产精品不卡毛片a在线 | 久草在线免费看视频 | 色天使色婷婷在线影院亚洲 | 亚洲免费视频观看 | 久久国产乱子伦精品免费不卡 | 99热这里只有精品2 99热这里只有精品3 | 一区二区三区免费精品视频 | 99色视频在线观看 | 中文字幕无线码中文字幕免费 | 国产成人高清 | 久久亚洲精品国产精品婷婷 | 精品福利 | 四虎在线观看免费视频 | 精品国产你懂的在线观看 | 狠狠色噜噜狠狠狠狠色综合网 | 日本一区二区三区高清福利视频 | 国产日韩欧美综合 | 日韩精品一区二区三区 在线观看 | 成人伊人网| 奇米影视第四色在线 | 99精品热 | 国产在线视频不卡 | 亚洲精品不卡视频 | 亚洲欧美日本视频 | 老司机午夜视频在线观看 | 一区二区在线不卡 | 国产精品亚洲成在人线 | 2022色婷婷综合久久久 | 一级国产视频 |