了解 Android 多屏显示:快速入门

本指南分为两部分,介绍了扩展 Phoneword 应用程序以处理第二个屏幕的情况。 与此同时,介绍了基础的 Android 应用程序构建基块,便于更深入探讨 Android 体系结构。

在本指南的演练部分中,将向 Phoneword 应用程序添加第二个屏幕,用于跟踪使用此应用转换的号码的相关历史记录。 最终的应用程序将具有第二个屏幕,可显示“已转换”的号码,如右侧屏幕截图所示:

示例应用屏幕截图

附随的深入了解将回顾构建的内容,并讨论体系结构、导航和此过程中遇到的其他 Android 新概念。

要求

由于本指南紧接了解 Android 中的内容,因此需要完成了解 Android 快速入门

演练

在本演练中,将向 Phoneword 应用程序添加一个“转换历史记录”屏幕

首先在 Visual Studio 中打开 Phoneword 应用程序,然后从“解决方案资源管理器”中编辑 Main.axml 文件

提示

Visual Studio 的较新版本支持在 Android Designer 中打开 .xml 文件。

.axml 和 .xml 文件均受 Android Designer 支持。

更新布局

从“工具箱”中将“按钮”拖动到 Design Surface 上,然后将其置于“TranslatedPhoneWord”TextView 下方。 在“属性面板”窗格中,将按钮“ID”更改为 @+id/TranslationHistoryButton

拖动新按钮

将按钮的 Text 属性设为 @string/translationHistory。 Android 设计器将按字面意思解读此属性,但用户需要做些更改,使按钮的文本正确显示:

设置转换历史记录按钮文本

解决方案资源管理器的“资源”文件夹下展开“值”节点,然后双击字符串资源文件 Strings.xml

打开 Strings.xml

Strings.xml 文件添加 translationHistory 字符串名称和值,然后保存该文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="translationHistory">Translation History</string>
    <string name="ApplicationName">Phoneword</string>
</resources>

“转换历史记录”按钮文本应会更新以反映新的字符串值

按钮反映新的字符串值

在 Design Surface 上选中“转换历史记录”按钮后,在“属性面板”窗格中查找 enabled 设置,然后将其值设为 false 以禁用此按钮。 这将导致按钮在设计图面上颜色变暗:

禁用转换历史记录按钮

创建第二个活动

再创建一个“活动”以支持第二个屏幕。 在“解决方案资源管理器”中,右键单击“Phoneword”项目,然后选择“添加”>“新项…”

添加新文件

在“添加新项”对话框中,选择“Visual C#”>“活动”,然后将活动文件命名为 TranslationHistoryActivity.cs。

将 TranslationHistoryActivity.cs 中的模板代码替换为以下代码

using System;
using System.Collections.Generic;
using Android.App;
using Android.OS;
using Android.Widget;
namespace Phoneword
{
    [Activity(Label = "@string/translationHistory")]
    public class TranslationHistoryActivity : ListActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            // Create your application here
            var phoneNumbers = Intent.Extras.GetStringArrayList("phone_numbers") ?? new string[0];
            this.ListAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, phoneNumbers);
        }
    }
}

在此类中,将按编程方式创建和填充 ListActivity,因此无需新建此活动的布局文件。 有关更详细的信息,请参阅了解 Android 多屏显示详述

添加列表

此应用会收集电话号码(用户已在第一个屏幕上转换的),然后传递给第二个屏幕。 电话号码以字符串列表的形式存储。 若要支持列表(和稍后使用的“意向”),请将以下 using 指令添加到 MainActivity.cs 顶部

using System.Collections.Generic;
using Android.Content;

然后请创建可使用电话号码填充的空白列表。 MainActivity 类将如下所示:

[Activity(Label = "Phoneword", MainLauncher = true)]
public class MainActivity : Activity
{
    static readonly List<string> phoneNumbers = new List<string>();
    ...// OnCreate, etc.
}

MainActivity 类中,添加以下代码以注册“转换历史记录”按钮(将此行放在 translateButton 声明后)

Button translationHistoryButton = FindViewById<Button> (Resource.Id.TranslationHistoryButton);

将以下代码添加到 OnCreate 方法的末尾,以关联“转换历史记录”按钮:

translationHistoryButton.Click += (sender, e) =>
{
    var intent = new Intent(this, typeof(TranslationHistoryActivity));
    intent.PutStringArrayListExtra("phone_numbers", phoneNumbers);
    StartActivity(intent);
};

更新“转换”按钮将电话号码添加到 phoneNumbers 列表。 用于 translateButtonClick 处理程序应与以下代码类似:

// Add code to translate number
string translatedNumber = string.Empty;
translateButton.Click += (sender, e) =>
{
    // Translate user's alphanumeric phone number to numeric
    translatedNumber = Core.PhonewordTranslator.ToNumber(phoneNumberText.Text);
    if (string.IsNullOrWhiteSpace(translatedNumber))
    {
        translatedPhoneWord.Text = "";
    }
    else
    {
        translatedPhoneWord.Text = translatedNumber;
        phoneNumbers.Add(translatedNumber);
        translationHistoryButton.Enabled = true;
    }
};

保存并生成应用程序,确保没有错误。

运行应用

向仿真器或设备部署应用程序。 下面的屏幕截图描述了正在运行的 Phoneword 应用程序:

示例屏幕快照

首先在 Visual Studio for Mac 中打开 Phoneword 项目,然后从“Solution Pad”中编辑 Main.axml 文件

提示

Visual Studio 的较新版本支持在 Android Designer 中打开 .xml 文件。

.axml 和 .xml 文件均受 Android Designer 支持。

更新布局

从“工具箱”中将“按钮”拖动到 Design Surface 上,然后将其置于“TranslatedPhoneWord”TextView 下方。 在“Properties Pad”中,将按钮“ID”更改为 @+id/TranslationHistoryButton

拖动新按钮

将按钮的 Text 属性设为 @string/translationHistory。 Android 设计器将按字面意思解读此属性,但用户需要做些更改,使按钮的文本正确显示:

设置转换历史记录按钮文本

在“Solution Pad”中的“Resources”文件夹下展开“values”节点,然后双击字符串资源文件 Strings.xml

打开的字符串

Strings.xml 文件添加 translationHistory 字符串名称和值,然后保存该文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="translationHistory">Translation History</string>
    <string name="ApplicationName">Phoneword</string>
</resources>

“转换历史记录”按钮文本应会更新以反映新的字符串值

按钮反映新的字符串值

在 Design Surface 上选中“转换历史记录”按钮后,在“Properties Pad”中打开“行为”选项卡,然后双击“已启用”复选框以禁用此按钮。 这将导致按钮在设计图面上颜色变暗:

禁用转换历史记录按钮

创建第二个活动

再创建一个“活动”以支持第二个屏幕。 在解决方案面板中,单击“Phoneword”项目旁的灰色齿轮图标,然后选择“添加”>“新文件...”

在“新建文件”对话框中,选择“Android”>“活动”,将活动命名为 TranslationHistoryActivity,然后单击“添加”。

TranslationHistoryActivity 中的模板代码替换为以下代码:

using System;
using System.Collections.Generic;
using Android.App;
using Android.OS;
using Android.Widget;
namespace Phoneword
{
    [Activity(Label = "@string/translationHistory")]
    public class TranslationHistoryActivity : ListActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            // Create your application here
            var phoneNumbers = Intent.Extras.GetStringArrayList("phone_numbers") ?? new string[0];
            this.ListAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, phoneNumbers);
        }
    }
}

在此类中,将按编程方式创建和填充 ListActivity,因此无需新建该活动的布局文件。 有关更详细的信息,请参阅了解 Android 多屏显示详述

添加列表

此应用会收集电话号码(用户已在第一个屏幕上转换的),然后传递给第二个屏幕。 电话号码以字符串列表的形式存储。 若要支持列表(和稍后使用的“意向”),请将以下 using 指令添加到 MainActivity.cs 顶部

using System.Collections.Generic;
using Android.Content;

然后请创建可使用电话号码填充的空白列表。 MainActivity 类将如下所示:

[Activity(Label = "Phoneword", MainLauncher = true)]
public class MainActivity : Activity
{
    static readonly List<string> phoneNumbers = new List<string>();
    ...// OnCreate, etc.
}

MainActivity 类中,添加以下代码以注册“转换历史记录”按钮(将此行放在 TranslationHistoryButton 声明后)

Button translationHistoryButton = FindViewById<Button> (Resource.Id.TranslationHistoryButton);

将以下代码添加到 OnCreate 方法的末尾,以关联“转换历史记录”按钮:

translationHistoryButton.Click += (sender, e) =>
{
    var intent = new Intent(this, typeof(TranslationHistoryActivity));
    intent.PutStringArrayListExtra("phone_numbers", phoneNumbers);
    StartActivity(intent);
};

更新“转换”按钮将电话号码添加到 phoneNumbers 列表。 用于 TranslateHistoryButtonClick 处理程序应与以下代码类似:

translateButton.Click += (sender, e) =>
{
    // Translate user's alphanumeric phone number to numeric
    translatedNumber = Core.PhonewordTranslator.ToNumber(phoneNumberText.Text);
    if (string.IsNullOrWhiteSpace(translatedNumber))
    {
        translatedPhoneWord.Text = "";
    }
    else
    {
        translatedPhoneWord.Text = translatedNumber;
        phoneNumbers.Add(translatedNumber);
        translationHistoryButton.Enabled = true;
    }
};

运行应用

向仿真器或设备部署应用程序。 下面的屏幕截图描述了正在运行的 Phoneword 应用程序:

示例屏幕快照

恭喜,你完成了第一个多屏 Xamarin.Android 应用程序! 现在可仔细分析刚才所学的工具和技能 - 接下来介绍“你好,Android 多屏幕深入分析”。