Xamarin.Android Designer の使用

この記事は、Xamarin.Android Designer のチュートリアルです。 小さなカラー ブラウザー アプリ用のユーザー インターフェイスを作成する方法について説明します。このユーザー インターフェイスは、すべて Designer で作成されます。

概要

Android のユーザー インターフェイスは、XML ファイルを使用して宣言的に作成することも、コードを記述してプログラム的に作成することもできます。 Xamarin.Android Designer を使用すると、開発者は XML ファイルを手動で編集する必要はなく、宣言型レイアウトを視覚的に作成および変更できます。 Designer では、アプリケーションをデバイスまたはエミュレーターに再デプロイする必要はなく、開発者が UI の変更を評価できるリアルタイム フィードバックも提供されます。 Designer のこれらの機能を使用すると、Android UI の開発を大幅に高速化できます。 この記事では、Xamarin.Android Designer を使用してユーザー インターフェイスを視覚的に作成する方法について説明します。

ヒント

新しいリリースの Visual Studio では、Android Designer 内で .xml ファイルを開くことができます。

Android Designer では、.axml ファイルと .xml ファイルの両方がサポートされています。

チュートリアル

このチュートリアルの目的は、Android Designer を使用して、カラー ブラウザー アプリの例向けのユーザー インターフェイスを作成することです。 カラー ブラウザー アプリには、色、名前、RGB 値の一覧が表示されます。 デザイン サーフェイスにウィジェットを追加する方法と、これらのウィジェットを視覚的にレイアウトする方法について説明します。 その後、デザイン サーフェイスまたは Designer の [プロパティ] ウィンドウを使用して、ウィジェットを対話的に変更する方法について説明します。 最後に、デバイスまたはエミュレーターでアプリを実行したときのデザインの外観を確認します。

新しいプロジェクトの作成

最初の手順は、新しい Xamarin.Android プロジェクトの作成です。 Visual Studio を起動し、[新しいプロジェクト...] をクリックし、[Visual C#] > [Android] > [Android アプリ (Xamarin)] テンプレートを選択します。 新しいアプリに DesignerWalkthrough という名前を付け、[OK] をクリックします。

Android blank app

[新しい Android アプリ] ダイアログで、[空のアプリ] を選択し、[OK] をクリックします。

Selecting the Android Blank App template

レイアウトの追加

次の手順では、ユーザー インターフェイス要素を保持する LinearLayout を作成します。 ソリューション エクスプローラーリソース/レイアウトを右クリックし、[追加] > [新しい項目...] を選択します。[新しい項目の追加] ダイアログで [Android レイアウト] を選択します。 ファイルに list_item という名前を付け、[追加] をクリックします。

New layout

新しい list_item レイアウトが Designer に表示されます。 2 つのウィンドウが表示されていることに注目してください。list_itemデザイン サーフェイスは左側のウィンドウに表示され、XML ソースは右側のウィンドウに表示されています。 2 つのウィンドウの間にある [ペインの入れ替え] アイコンをクリックすると、[デザイン サーフェイス] ウィンドウと [ソース] ウィンドウの位置を入れ替えることができます。

Designer view

[表示] メニューから [その他のウィンドウ] > [ドキュメント アウトライン] をクリックして、ドキュメント アウトラインを開きます。 ドキュメント アウトラインは、レイアウトに現在 1 つの LinearLayout ウィジェットが含まれていることを示しています。

Document outline

次の手順では、この LinearLayout 内のカラー ブラウザー アプリ用のユーザー インターフェイスを作成します。

リスト項目ユーザー インターフェイスの作成

[ツールボックス] ウィンドウが表示されない場合は、左側の [ツールボックス] タブをクリックします。 ツールボックスで、[イメージとメディア] セクションまで下にスクロールし、ImageView の場所が見つかるまでさらに下にスクロールします。

Locate ImageView

または、検索バーに「ImageView」と入力して、ImageView を見つけることができます。

ImageView search

この ImageView をデザイン サーフェイスにドラッグします (この ImageView は、カラー ブラウザー アプリに色の見本を表示するために使用されます)。

ImageView on canvas

次に、LinearLayout (Vertical) ウィジェットをツールボックスから Designer にドラッグします。 青い輪郭は、追加された LinearLayout の境界を示していることに注意してください。 ドキュメント アウトラインは、imageView1 (ImageView) の下にある LinearLayout の子であることを示しています。

Blue outline

Designer で ImageView を選択すると、青い輪郭が ImageView を囲むように移動します。 また、選択範囲はドキュメント アウトラインimageView1 (ImageView) に移動します。

Select ImageView

次に、Text (Large) ウィジェットをツールボックスから新しく追加された LinearLayout にドラッグします。 Designer は、新しいウィジェットが挿入される場所を示すために、緑色の強調表示を使用していることに注意してください。

Green highlights

次に、Text (Large) ウィジェットの下に Text (Small) ウィジェットを追加します。

Add small text widget

この時点で、デザイナー画面は次のスクリーンショットのようになります。

Screenshot shows the Designer surface with Toolbox, Document Outline, and layout area with small text selected.

2 つの textView ウィジェットが linearLayout1 内に存在しない場合は、ドキュメント アウトラインlinearLayout1 にドラッグして、前のスクリーンショットのように表示されるように配置します (linearLayout1 の下にインデントされます)。

ユーザー インターフェイスの配置

次の手順では、ImageViewImageView の左に表示し、TextView ウィジェットを右に重ねて表示するように UI を変更します。

  1. ImageView を選択します。

  2. プロパティ ウィンドウを検索ボックスに入力し、[レイアウト幅] を見つけます。

  3. [レイアウト幅] 設定を wrap_content に変更します。

Set wrap content

Width の設定を変更する別の方法は、ウィジェットの右側にある三角形をクリックして、幅の設定を wrap_content に切り替えることです。

Drag to set width

三角形をもう一度クリックすると、Width の設定が match_parent に戻ります。 次に、[ドキュメント アウトライン] ウィンドウに移動し、ルート LinearLayout を選択します。

Select root LinearLayout

ルート LinearLayout を選択した状態で [プロパティ] ウィンドウに戻り、検索ボックスに「方向」と入力して [方向] 設定を見つけます。 [方向]horizontal に変更します:

Select horizontal orientation

この時点で、デザイナー画面は次のスクリーンショットのようになります。 TextView ウィジェットが ImageView の右側に移動していることに注目してください。

Screenshot shows the Designer surface with Toolbox, Document Outline, and layout area.

間隔の変更

次の手順では、UI のパディングと余白の設定を変更し、ウィジェット間の間隔を確保します。 デザイン サーフェイスで [ImageView] を選択します。 [プロパティ] ウィンドウの検索ボックスに「min」と入力します。 [高さの最小値] には「70dp」、[幅の最小値] には「50dp」と入力します。

Set height and width

[プロパティ] ウィンドウで、検索ボックスに「padding」と入力し、[パディング] に「10dp」と入力します。 これらの minHeightminWidthpadding の設定は、ImageView のすべての辺の周りにパディングを追加し、縦方向に細長くなります。 次の値を入力すると、レイアウト XML が変更されることに注意してください。

Set padding

下、左、右、上のパディング設定は、それぞれ [下のパディング][左のパディング][右のパディング][上のパディング] フィールドに値を入力して個別に設定できます。 たとえば、[左のパディング] フィールドを 5dp に、[下のパディング][右のパディング][上のパディング] フィールドを 10dp に設定します。

Custom padding settings

次に、2 つの TextView ウィジェットを含む LinearLayout ウィジェットの位置を調整します。 [ドキュメント アウトライン] で、linearLayout1 を選択します。 [プロパティ] ウィンドウの検索ボックスに「margin」と入力します。 [下のレイアウト余白][左のレイアウト余白][上のレイアウト余白]5dp に設定します。 [右のレイアウト余白]0dp に設定します。

Set margins

既定のイメージの削除

ImageView は (イメージではなく) 色を表示するために使用されているため、次の手順では、テンプレートで追加された既定のイメージのソースを削除します。

  1. デザイン サーフェイスで [ImageView] を選択します。

  2. [プロパティ] で、検索ボックスに「src」と入力します。

  3. Src プロパティ設定の右側にある小さな四角形をクリックし、[リセット] を選択します。

Clear the ImageView src setting

これにより、その ImageView のソース XML から android:src="@android:drawable/ic_menu_gallery" が削除されます。

ListView コンテナーの追加

list_item レイアウトが定義されたので、次の手順ではメイン レイアウトに ListView を追加します。 この ListView には、list_item の一覧が含まれます。

ソリューション エクスプローラーResources/layout/activity_main.axml を開きます。 ツールボックスで、ListView ウィジェットを見つけてデザイン サーフェイスにドラッグします。 Designer の ListView は、選択されたときにその境界の輪郭を描く青い線以外は空白になります。 ドキュメント アウトラインを表示して、ListView が正しく追加されたことを確認できます。

New ListView

既定では、ListView には @+id/listView1Id 値が付与されます。 ドキュメント アウトラインlistView1 を選択したまま、[プロパティ] ウィンドウを開き、[並べ替え] をクリックし、[カテゴリ] を選択します。 [メイン] を開き、ID プロパティを見つけ、その値を @+id/myListView に変更します。

Rename id to myListView

この時点で、ユーザー インターフェイスを使用する準備ができました。

アプリケーションの実行

MainActivity.cs を開き、そのコードを次のように置き換えます。

using Android.App;
using Android.Widget;
using Android.Views;
using Android.OS;
using Android.Support.V7.App;
using System.Collections.Generic;

namespace DesignerWalkthrough
{
    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        List<ColorItem> colorItems = new List<ColorItem>();
        ListView listView;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);
            listView = FindViewById<ListView>(Resource.Id.myListView);

            colorItems.Add(new ColorItem()
            {
                Color = Android.Graphics.Color.DarkRed,
                ColorName = "Dark Red",
                Code = "8B0000"
            });
            colorItems.Add(new ColorItem()
            {
                Color = Android.Graphics.Color.SlateBlue,
                ColorName = "Slate Blue",
                Code = "6A5ACD"
            });
            colorItems.Add(new ColorItem()
            {
                Color = Android.Graphics.Color.ForestGreen,
                ColorName = "Forest Green",
                Code = "228B22"
            });

            listView.Adapter = new ColorAdapter(this, colorItems);
        }
    }

    public class ColorAdapter : BaseAdapter<ColorItem>
    {
        List<ColorItem> items;
        Activity context;
        public ColorAdapter(Activity context, List<ColorItem> items)
            : base()
        {
            this.context = context;
            this.items = items;
        }
        public override long GetItemId(int position)
        {
            return position;
        }
        public override ColorItem this[int position]
        {
            get { return items[position]; }
        }
        public override int Count
        {
            get { return items.Count; }
        }
        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            var item = items[position];

            View view = convertView;
            if (view == null) // no view to re-use, create new
                view = context.LayoutInflater.Inflate(Resource.Layout.list_item, null);
            view.FindViewById<TextView>(Resource.Id.textView1).Text = item.ColorName;
            view.FindViewById<TextView>(Resource.Id.textView2).Text = item.Code;
            view.FindViewById<ImageView>(Resource.Id.imageView1).SetBackgroundColor(item.Color);

            return view;
        }
    }

    public class ColorItem
    {
        public string ColorName { get; set; }
        public string Code { get; set; }
        public Android.Graphics.Color Color { get; set; }
    }
}

このコードでは、カスタム ListView アダプターを使用して色情報を読み込み、作成したばかりの UI にこのデータを表示します。 この例では色情報を一覧にハードコーディングしていますが、アダプターを変更してデータ ソースから色情報を抽出したり、その場で計算したりすることもできます。 ListView アダプターの詳細については、「ListView」を参照してください。

アプリケーションをビルドして実行します。 次のスクリーンショットは、デバイスでアプリを実行しているときのアプリの表示例です。

Final screenshot

まとめ

この記事では、Visual Studio で Xamarin.Android Designer を使用して基本的なアプリのユーザー インターフェイスを作成するプロセスのチュートリアルを行いました。 一覧で 1 つの項目のインターフェイスを作成する方法を示し、ウィジェットを追加して視覚的にレイアウトする方法について説明しました。 また、リソースを割り当て、それらのウィジェットにさまざまなプロパティを設定する方法についても説明しました。