亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

第1個Android應用程序 Android制作簡單單頁導航

2019-10-23 20:36:49
字體:
來源:轉載
供稿:網友

本例子演示如何添加一個簡單的單頁導航,在此基礎上,再演示如何在第2個頁面中顯示第1個頁面中撥打過的所有電話號碼。

(1)通過該例子理解Android App的基本架構。

(2)通過該例子理解實現Android多屏幕導航的基本技術。

本例子只是為了讓我們對Android App開發有一個較全面的感性認識,讀者不必一開始就糾結于代碼中的細節問題,涉及到的相關概念在后面還會分別介紹。

運行截圖

運行截圖(Api19、Api21、Api23的實現代碼都相同):

Android,Android應用程序,Android單頁導航

Android,Android應用程序,Android單頁導航

界面操作

單擊“將文本轉換為數字”,觀察結果。

單擊【轉換】按鈕,如果轉換成功,則【撥號】按鈕可用,單擊【撥號】按鈕,觀察彈出的對話框。

如果單擊【撥號】按鈕,就會自動撥號。

下面介紹主要設計步驟。

1、新建項目

選擇模板:Blank App (Android),項目名:PhonewordApp。

Android,Android應用程序,Android單頁導航

項目創建成功后,刪除GettingStarted.Xamarin(廣告文件)。

2、界面設計

(1)雙擊打開Main.axml,分別觀察設計界面【Design】和源碼【Source】的內容。

Android,Android應用程序,Android單頁導航

(2)按Delete鍵刪除【Hello World,Click Me】按鈕。

(3)從【工具箱】中拖放一個【Text (Large)】到設計界面,修改下面的屬性:

id:@+id/PhoneText

text:電話

注:此時系統會自動在【Source】中添加對應的代碼(下同)。

(4)從【工具箱】中拖放一個【Plain Text】到設計界面,放到【Text (Large)】的下方,修改下面的屬性:

id:@+id/PhoneNumberText

text:138 4912 2599

(5)從【工具箱】中拖放一個【Button】到設計界面,放到【Plain Text】的下方,修改下面的屬性:

id:@+id/buttonTranslate

text:轉換

(6)從【工具箱】中拖放一個【Button】到設計界面放到上一個按鈕的下方,修改屬性:

id:@+id/buttonCall

text:撥號

經過以上步驟后,即得到下圖所示的設計界面:

Android,Android應用程序,Android單頁導航

(7)保存文件,并單擊【解決方案資源管理器】上方的【刷新】按鈕。

注意:這一步的目的是為了讓系統能找到設計界面內的資源并自動生成對應的ID,以便在后面鍵入C#代碼時能看到與設計界面資源相關的智能提示。

3、編寫C#代碼

(1)鼠標右擊項目名à添加類,在彈出的窗口中,選擇【Class】模板,名稱:PhoneTranslator.cs,如下圖所示,單擊【添加】按鈕。

Android,Android應用程序,Android單頁導航

然后將PhoneTranslator.cs改為下面的代碼:

using System.Text;namespace PhonewordApp{  public static class PhonewordTranslator  {    public static string ToNumber(string raw)    {      if (string.IsNullOrWhiteSpace(raw))      {        return "";      }      else      {        raw = raw.ToUpperInvariant();      }      var newNumber = new StringBuilder();      foreach (var c in raw)      {        if ("- 0123456789".Contains(c))          newNumber.Append(c);        else        {          var result = TranslateToNumber(c);          if (result != null)            newNumber.Append(result);        }      }      return newNumber.ToString();    }    static bool Contains(this string keyString, char c)    {      return keyString.IndexOf(c) >= 0;    }    static int? TranslateToNumber(char c)    {      if ("ABC".Contains(c))        return 2;      else if ("DEF".Contains(c))        return 3;      else if ("GHI".Contains(c))        return 4;      else if ("JKL".Contains(c))        return 5;      else if ("MNO".Contains(c))        return 6;      else if ("PQRS".Contains(c))        return 7;      else if ("TUV".Contains(c))        return 8;      else if ("WXYZ".Contains(c))        return 9;      return null;    }  }}

(2)打開MainActivity.cs,將該文件改為下面的代碼:

using System;using Android.App;using Android.Content;using Android.Runtime;using Android.Views;using Android.Widget;using Android.OS;using System.Collections.Generic;namespace PhonewordApp{  [Activity(Label = "PhonewordApp", MainLauncher = true, Icon = "@drawable/icon")]  public class MainActivity : Activity  {    static readonly List<string> phoneNumbers = new List<string>();    protected override void OnCreate(Bundle bundle)    {      base.OnCreate(bundle);      SetContentView(Resource.Layout.Main);      var phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);      var buttonTranslate = FindViewById<Button>(Resource.Id.buttonTranslate);      var buttonCall = FindViewById<Button>(Resource.Id.buttonCall);      buttonCall.Enabled = false; //禁用【撥號】按鈕      string translatedNumber = string.Empty;      buttonTranslate.Click += (s, e) =>      {        translatedNumber = PhonewordTranslator.ToNumber(phoneNumberText.Text);        if (string.IsNullOrWhiteSpace(translatedNumber))        {          buttonCall.Text = "撥號";          buttonCall.Enabled = false;        }        else        {          buttonCall.Text = "播出號碼:" + translatedNumber + ",單擊確認!";          buttonCall.Enabled = true;        }      };      var buttonCallHistory = FindViewById<Button>(Resource.Id.buttonCallHistory);      buttonCallHistory.Click += (sender, e) =>      {        var intent = new Intent(this, typeof(CallHistoryActivity));        intent.PutStringArrayListExtra("phone_numbers", phoneNumbers);        StartActivity(intent);      };      buttonCall.Click += (s, e) =>      {        phoneNumbers.Add(translatedNumber);        buttonCallHistory.Enabled = true;        // 當單擊【撥號】時,嘗試撥號        var callDialog = new AlertDialog.Builder(this);        callDialog.SetMessage("電話:" + translatedNumber + ",撥號嗎?");        callDialog.SetNeutralButton("撥號", delegate        {          var callIntent = new Intent(Intent.ActionCall);          callIntent.SetData(Android.Net.Uri.Parse("tel:" + translatedNumber));          StartActivity(callIntent);        });        callDialog.SetNegativeButton("取消", delegate { });        callDialog.Show();      };    }  }}

(3)重新生成項目,確保無錯誤。

注:drawable文件夾下的Icon.png是要顯示的圖標,也可將其換為其他圖標文件。

(4)選擇主菜單下該項目的屬性,在彈出的窗口中,勾選【CALL PHONE】權限:

Android,Android應用程序,Android單頁導航

注:

(1)這一步必須做,否則因該App無撥號權限,撥號功能會失敗。

(2)設置后,查看Properties文件夾下AndroidManifest.xml文件中自動添加的代碼,理解權限設置的作用。

4、調試運行及代碼片段解釋

選擇一種模擬器,然后按<F5>鍵調試運行。

注意:如果使用低于API 23的模擬器,必須設置項目屬性(主菜單à項目屬性),使用對應版本的API來編譯應用程序,否則在模擬器上運行時可能會出現應用程序一閃就退出或者顯示“應用程序已停止運行”的情況。

下面解釋前面已經實現的代碼片段的含義:

(1)如何顯示Alert對話框

AlertDialog的詳細用法見【第6章 UI設計(三)--對話框】。

(2)如何撥號

下面的代碼演示了如何調用系統功能實現撥號:

var callIntent = new Intent(Intent.ActionCall);

callIntent.SetData(Android.Net.Uri.Parse("tel:" + translatedNumber));

StartActivity(callIntent);

注意:運行前需要先勾選【CALL PHONE】設置允許撥號權限,否則運行會出現異常:

Android,Android應用程序,Android單頁導航

5、創建第2個屏幕跟蹤歷史記錄

(1)打開values文件夾下的Strings.xml文件,添加下面的代碼:

<?xml version="1.0" encoding="utf-8"?><resources>……<string name="CallHistory">撥號記錄</string></resources>

(2)單擊【解決方案資源管理器】上方的“刷新”按鈕,或者重新生成項目。

注:選擇其中之一即可,目的是為了讓C#代碼能識別它。

(3)打開Main.axml,從【工具箱】中拖放一個【Button】到Main.axml設計界面,將其放到上一個按鈕的下方,修改屬性:

id:@+id/buttonCallHistory

text:@string/CallHistory

enabled:false

注: @string/CallHistory的含義是在values文件夾下的Strings.xml文件中提供該變量的值。

此時,可看到“STRING/CALLHISTORY”會自動變成“撥號記錄”。

說明:這一步設置變量值的做法是實際的Android App項目中建議的做法,這樣做的好處是能提高安卓App運行的效率。而步驟1的做法是一種硬編碼的做法,硬編碼在安卓App中不是建議的做法,步驟1只是為了剛入門時理解更容易。

(4)鼠標右擊項目名,選擇【添加…】à【新建項】,在彈出的窗口中,選擇“Activity”模板,文件名:CallHistoryActivity.cs,單擊【添加】。然后將該文件改為下面的內容(省略了using……):

namespace PhonewordApp{[Activity(Label = "CallHistoryActivity")]public class CallHistoryActivity : ListActivity{protected override void OnCreate(Bundle bundle){base.OnCreate(bundle);var phoneNumbers =Intent.Extras.GetStringArrayList("phone_numbers") ?? new string[0];this.ListAdapter = new ArrayAdapter<string>(this,Android.Resource.Layout.SimpleListItem1, phoneNumbers);}}}

其中,c = a??b; 的含義相當于:if (a != null ){ c = a;} else { c = b;}

(5)修改MainActivity.cs文件,目標是收集第1個屏幕界面運行時撥打過的所有電話號碼,并將其在第2個屏幕上顯示出來。在MainActivity.cs文件中添加下面的代碼:

……using System.Collections.Generic;namespace E01PhonewordApp{[Activity(Label = "E01PhonewordApp", MainLauncher = true, Icon = "@drawable/icon")]public class MainActivity : Activity{static readonly List<string> phoneNumbers = new List<string>();protected override void OnCreate(Bundle bundle){……var buttonCallHistory =FindViewById<Button>(Resource.Id.buttonCallHistory);buttonCallHistory.Click += (sender, e) =>{var intent = new Intent(this, typeof(CallHistoryActivity));intent.PutStringArrayListExtra("phone_numbers",phoneNumbers);StartActivity(intent);};buttonCall.Click += (s, e) =>{phoneNumbers.Add(translatedNumber);buttonCallHistory.Enabled = true;// 當單擊【撥號】時,嘗試撥號var callDialog = new AlertDialog.Builder(this);callDialog.SetMessage("播出號碼:" + translatedNumber +",撥號嗎?");callDialog.SetNeutralButton("撥號", delegate{// Create intent to dial phonevar callIntent = new Intent(Intent.ActionCall);callIntent.SetData(Android.Net.Uri.Parse("tel:" +translatedNumber));StartActivity(callIntent);});callDialog.SetNegativeButton("取消", delegate { });callDialog.Show();};}}}

(6)重新生成項目,確保無錯誤。

(7)運行,再撥一個號(例如12345678901),然后查看撥號記錄。下圖是用另一種模擬器查看的運行效果(你可以創建多種不同的模擬器,分別觀察同一個項目的運行效果):

Android,Android應用程序,Android單頁導航

到這里,我們就完成了用C#編寫的第1個Android應用程序。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频福利一区| 亚洲成人av在线播放| 欧美亚洲另类在线| 91在线精品播放| 日韩av片永久免费网站| 国产精品国产三级国产专播精品人| 亚洲精品理论电影| 亚洲欧美成人精品| 欧美日韩一区二区三区在线免费观看| 亚洲3p在线观看| 欧美激情乱人伦一区| 91久久久久久久| 中文字幕最新精品| 欧美小视频在线| 国产精品99导航| 精品久久久久久久久国产字幕| 亚洲香蕉成人av网站在线观看| 日韩av中文字幕在线| 成人福利在线观看| 青青久久av北条麻妃海外网| 亚洲香蕉av在线一区二区三区| 三级精品视频久久久久| 国产欧美va欧美va香蕉在| 久久国产精品影视| 亚洲国产97在线精品一区| 国产精品美女av| 中文日韩在线视频| 亚洲第一免费网站| 日韩精品福利网站| 亚洲人成在线观看网站高清| 亚洲自拍欧美色图| 国产精品亚洲美女av网站| 国产精品美女999| 综合国产在线观看| 国产亚洲人成网站在线观看| 欧美国产视频日韩| 国产欧美亚洲精品| 在线观看国产成人av片| 欧洲日韩成人av| 国产偷亚洲偷欧美偷精品| 一级做a爰片久久毛片美女图片| 国产精品爽爽爽| 国产精品久久电影观看| 久久精品久久久久久国产 免费| 久久琪琪电影院| 亚洲国产日韩欧美在线99| 国产精品自产拍在线观看中文| 国产精品三级久久久久久电影| 亚洲精品资源在线| 色爱av美腿丝袜综合粉嫩av| 97在线视频免费观看| 久久网福利资源网站| 欧美怡红院视频一区二区三区| 国产视频精品一区二区三区| 欧美尺度大的性做爰视频| 亚洲精品一区二区网址| 欧美日韩国产一区二区三区| 国产精品电影一区| 午夜精品一区二区三区在线视频| 国产91精品久久久久久| 国产精品 欧美在线| 亚洲精品大尺度| 精品国产老师黑色丝袜高跟鞋| 国产精品尤物福利片在线观看| 成人国产精品日本在线| 中文字幕亚洲二区| 亚洲国产精品va在线观看黑人| 欧美巨大黑人极品精男| 久久精品国产一区| 久久精品国产69国产精品亚洲| 97久久精品人搡人人玩| 欧美专区福利在线| 久久久久久97| 欧美日韩在线免费| 久久视频中文字幕| 久久艹在线视频| 久久伊人色综合| 亚洲深夜福利网站| 自拍偷拍亚洲一区| 精品久久久久久中文字幕一区奶水| 高清视频欧美一级| 不卡中文字幕av| 在线视频欧美日韩精品| 性欧美激情精品| 欧洲美女7788成人免费视频| 国内外成人免费激情在线视频网站| 国产成人精品久久二区二区91| 亚洲精品综合精品自拍| 国产成人精品免高潮在线观看| 国产大片精品免费永久看nba| 欧美大片第1页| 尤物精品国产第一福利三区| 国产精品草莓在线免费观看| 欧美又大粗又爽又黄大片视频| 日韩免费不卡av| 国产精品亚洲激情| 北条麻妃一区二区三区中文字幕| 色综合91久久精品中文字幕| 亚洲欧洲激情在线| 日韩中文在线不卡| 成人黄色在线观看| 欧美视频国产精品| 国产精品久久不能| 日韩a**站在线观看| 91精品国产精品| 亚洲第一福利网| 日韩在线视频观看正片免费网站| 久久久久久久久久亚洲| 亚洲精品ady| 亚洲精选中文字幕| 欧美亚洲国产成人精品| 国产视频999| 麻豆国产va免费精品高清在线| 久久久久在线观看| 欧美一级片免费在线| 中文字幕日韩免费视频| 日韩精品中文字幕有码专区| 精品久久久久久中文字幕一区奶水| 亚洲精品按摩视频| 国产成人精品午夜| 久久久久久久久久久亚洲| 麻豆精品精华液| 亚洲第一精品自拍| 亚洲男女性事视频| 欧美激情视频网| 日韩高清免费观看| 欧美大片免费看| 久久人人爽人人爽爽久久| 欧美巨猛xxxx猛交黑人97人| 91高清视频免费观看| 欧美在线视频导航| 亚洲综合日韩中文字幕v在线| 国产亚洲欧洲黄色| 美女扒开尿口让男人操亚洲视频网站| 超碰97人人做人人爱少妇| 亚洲国产成人久久| 欧美成人精品一区| 亚洲成年人在线| 亚洲自拍av在线| 国产999精品久久久影片官网| 福利视频一区二区| 日韩精品视频在线观看免费| 国产精品福利网站| 亚洲国产99精品国自产| 韩国19禁主播vip福利视频| 国产精品电影网| 欧美乱大交xxxxx另类电影| 亚洲成人999| 国产精品亚洲精品| 国产亚洲精品美女久久久久| 丝袜美腿精品国产二区| 国产精品∨欧美精品v日韩精品| www.亚洲天堂| 久久国产精品久久久| 成人a在线视频| 日韩av免费在线观看| 17婷婷久久www| 国产精品第一第二| 国产一区二区三区三区在线观看| 亚洲a区在线视频| 国产免费观看久久黄| 美女视频黄免费的亚洲男人天堂| 欧美黑人xxx| 456国产精品|