質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

7290閲覧

Xamarin.Androidコードによるコントロールの配置方法

M.inose

総合スコア17

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2017/03/16 02:20

###前提・実現したいこと

Xamarin.Androidコードによるコントロールの配置方法についてご教示ください。

Xamarin.Androidでアプリケーションを開発しております。
このアプリケーションは、上位からの指示で画面を構成します。

その為、レイアウト、ボタン等を動的に生成しなければなりません。

いろいろな情報を調べて、例えばレイアウトなら以下のコードで、実現できることが分かりました。

//リニアレイアウトを生成
var linearLayout = new LinearLayout(this) {
Orientation = Orientation.Vertical //子コントロールを縦方向に配置する
};

ところが、Orientation以外の情報を設定する方法が分かりません。

###該当のソースコード
例えば

Main.axmlの

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" />

の記述で動的にLinearLayoutを生成する場合は

var linearLayout = new LinearLayout(this) {
Orientation = Orientation.Vertical //子コントロールを縦方向に配置する
<-ここにandroid:layout_widthやandroid:layout_heightを記述したい
};

にどの様に記述すればよろしいのでしょうか?

また、他にレイアウト、ボタン等を動的に生成する方法があれば併せて
皆様にご教示いただきたく、お願い申し上げます。

###補足情報(言語/FW/ツール等のバージョンなど)
開発環境
Visual studio 2015
Xamain 4.3.0.784
Xamain.Android 7.1.0.41
Android SDK Tools 25.2.5
Android API 6.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

layout_widthやlayout_heightなどのlayout_から始まる属性は親Viewに対する設定値です。
ですので、親View配下のLayoutParamsクラスを生成し、生成したインスタンスに対して値を設定・子ViewのLayoutParametersプロパティに格納という形でlayout_widthなどは動的に設定できます。
(たとえば親がFrameLayoutの場合はFrameLayout.LayoutParamsクラス)
(axml(xml)から生成したレイアウトを動的に扱う場合はすでに格納されているのでキャストして利用)

textやgravity、paddingなどの属性は自身に対する設定値なのでOrientationのように設定することが可能です(この際、Java向けAPIからプロパティではなくメソッドに置き換えられている場合もあるのでオブジェクト初期化子内で記述できないこともあります)

以下のサンプルコードのようにレイアウトをコードから動的に生成するのは位置・サイズ調整など大変な要素が大きいのでLayoutInflaterなどを利用して極力axml(xml)からレイアウトを作成することをお勧めします。

また、Xamarin.AndroidにつきましてはAndroid(Java) APIをそのまま置き換えている面が大きいので、Android自体の開発に関する疑問は、Javaなどで記述されている記事などが検索で引っかかることが多いと思うのでそちらを参考にすればいいでしょう。(もちろんXamarin.Android固有の疑問点なども出ますので適宜調べ方の調整は必要です)

MainActivity.cs

csharp

1using Android.App; 2using Android.Content; 3using Android.OS; 4using Android.Views; 5using Android.Widget; 6 7namespace TeratailLayoutExample { 8 9 [Activity(Label = "TeratailLayoutExample", MainLauncher = true, Icon = "@drawable/icon")] 10 public class MainActivity : Activity { 11 12 protected override void OnCreate(Bundle bundle) { 13 base.OnCreate(bundle); 14 15 //SetContentView(Resource.Layout.Main); 16 SetContentView(makeViews()); 17 } 18 19 private View makeViews() { 20 var root = new LinearLayout(this) { 21 Orientation = Orientation.Vertical, 22 LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent) 23 }; 24 25 var title = new TextView(this) { 26 Text = "Title", 27 Gravity = GravityFlags.Center, 28 LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent) 29 }; 30 root.AddView(title); 31 32 var horizontalLayout = new LinearLayout(this) { 33 Orientation = Orientation.Horizontal, 34 LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent) { 35 TopMargin = this.ConvertDensityIndependentPixelToPixel(16f) 36 } 37 }; 38 root.AddView(horizontalLayout); 39 40 var leftText = new TextView(this) { 41 Text = "LeftText", 42 Gravity = GravityFlags.Center, 43 LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent) { 44 Weight = 1f 45 } 46 }; 47 horizontalLayout.AddView(leftText); 48 49 var rightText = new TextView(this) { 50 Text = "RightText", 51 Gravity = GravityFlags.Center, 52 LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent) { 53 Weight = 1f 54 } 55 }; 56 horizontalLayout.AddView(rightText); 57 58 var content = new TextView(this) { 59 Text = "Dynamic Layout", 60 Gravity = GravityFlags.Center, 61 LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent) 62 }; 63 content.SetPadding(0, this.ConvertDensityIndependentPixelToPixel(16f), 0, 0); 64 root.AddView(content); 65 66 return root; 67 } 68 } 69 70 public static class ContextExtension { 71 72 public static int ConvertDensityIndependentPixelToPixel(this Context context, float dp) { 73 var metrics = context.Resources.DisplayMetrics; 74 return (int)(dp * ((int)metrics.DensityDpi / 160f)); 75 } 76 } 77} 78

Main.axml

axml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 <TextView 7 android:text="Title" 8 android:layout_width="match_parent" 9 android:layout_height="wrap_content" 10 android:id="@+id/Title" 11 android:gravity="center" /> 12 <LinearLayout 13 android:orientation="horizontal" 14 android:layout_marginTop="16dp" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:id="@+id/HorizontalLayout"> 18 <TextView 19 android:text="LeftText" 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:layout_weight="1" 23 android:gravity="center" 24 android:id="@+id/LeftText" /> 25 <TextView 26 android:text="RightText" 27 android:layout_width="wrap_content" 28 android:layout_height="wrap_content" 29 android:layout_weight="1" 30 android:gravity="center" 31 android:id="@+id/RightText" /> 32 </LinearLayout> 33 <TextView 34 android:text="Static Layout" 35 android:layout_width="match_parent" 36 android:layout_height="wrap_content" 37 android:paddingTop="16dp" 38 android:id="@+id/Content" 39 android:gravity="center" /> 40</LinearLayout>

コードから生成:
コードから生成したレイアウト
axmlから生成:
axmlから生成したレイアウト

投稿2017/03/16 17:08

meilcli

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

M.inose

2017/03/17 02:38

meilcli様 早々に、ご回答いただき大変にありがとうございます。 動作を確認致しました。 具体的なサンプルソースコードを提示いただき大変にありがとうございます。 感謝、感謝、感謝です。 今回の開発は、レイアウト、ツール等全て動的に生成しなければならず、途方に暮れていました。 LayoutInflaterの使用方法も調べてみます。 (プロジェクトで新規作成したaxmlではなく、動的に作成したaxmlを読み込む方法があればいいのですが。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問