28403


Androidの開発を始めたばかりです。  
Visual StudioとXamarinを使用しており、少しずつプログラムを覚えています。

<http://www.javadrive.jp/android/button/index2.html>

上記のURLのサンプルプログラムを参考にボタン配置を縦に２つ配置しようとしていますが、エラーが出てしまい、修正方法がわかりません。

現在のコードは以下の通りです。

[code]

    [Activity(Label = "AndroidApp5", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : BaseActivity
    {
    
        protected override int LayoutResource
        {
            get { return Resource.Layout.main; }
        }
    
    
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
    
            LinearLayout linearLayout = new LinearLayout(this);
            linearLayout.setOrientation(linearLayout.VERTICAL);
            setContentView(linearLayout);
    
            Button button1 = new Button(this);
            SetContentView(button1, new ViewGroup.LayoutParams(WindowManagerLayoutParams.WrapContent, WindowManagerLayoutParams.WrapContent));
    
            Button button2 = new Button(this);
            SetContentView(button2, new ViewGroup.LayoutParams(WindowManagerLayoutParams.WrapContent, WindowManagerLayoutParams.WrapContent));
    
        }
    
        private void setContentView(LinearLayout linearLayout)
        {
            throw new NotImplementedException();
        }
    }
    
[/code]

>
> 'LinearLayout'に'setOrientation'の定義が含まれておらず、型'LinearLayout'の最初の引数を受け付ける拡張メソッド'setOrientation'が見つかりませんでした。usingディレクティブまたはアセンブリ参照が不足していないことを確認してください。
>
>
> 'LinearLayout'に'VERTICAL'の定義が含まれておらず、型'LinearLayout'の最初の引数を受け付ける拡張メソッド'VERTICAL'が見つかりませんでした。usingディレクティブまたはアセンブリ参照が不足していないことを確認してください。

この２つのエラーが出ます。  
また

> private final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;

このコードをどこに配置すればよいのか、どう改変すればよいのかわかりません。  
どう解決すればよいでしょうか？

**追記**

ものすごく丁寧でわかりやすい回答ありがとうございます！

教えていただいたコードの

[code]

    private const int WrapContent = ViewGroup.LayoutParams.WrapContent; 
    
[/code]

この上に

[code]

    protected override int LayoutResource
            {
                get { return Resource.Layout.main; }
            }
    
[/code]

これを書いたらエラーが消えました！  
button2がbutton1に重なっている状況...でしたが、ボタンのところのコードがそのままになってたのでそれを修正したところ、解決しました！


CC BY-SA 3.0
2016-08-20T23:19:30.937
28400
2016-08-24T22:30:02.760
2016-08-24T22:30:02.760
18536
18536
question
android xamarin xamarin-native
setOrientationはXamarinで使用できるのか


サンプルプログラムにあるように、Android SDK の API は Java で記述するものとなっています。一方、Xamarin は C#
ですので、Java の API を C# という別の言語にエクスポートしています。

このとき、より C# らしく書けるように、以下のような変更が加えられています。

  * Java にはない言語仕様（プロパティ、イベント）で置き換え
  * 型安全に書けるように定数を `enum` に変更（Java にも `enum` はありますが、Android は初期のスペックの低い端末のために `enum` より `int` 定数が好んで使われていました）
  * 定数、メソッドの命名規則を C# ものに変更

# setOrientation の使い方

`setOrientation()` メソッドは、`Orientation` プロパティに翻訳されています。

値は `LinearLayout.VERTICAL` という int の定数から、`Orientation` という `enum` の
`Orientation.Vertical` に変更されています。

プロパティ名が大文字から始まる、PascalCase と呼ばれる命名規則となっているのは、C# が Object Pascal、Delphi
の系譜に当たる言語だからです。

# 定数の書き方

`readonly` または `const` キーワードを使用します。配置する場所はフィールドのままで問題ありません。

[code]

    private const int WrapContent = ViewGroup.LayoutParams.WrapContent;
    
[/code]

C# では定数名もPascalCase で書くのが基本で、`WRAP_CONTENT`
のように大文字でアンダーバーで連結するのではなく、`ViewGroup.LayoutParams.WrapContent` と書きます。

以上を踏まえて、コードの全体を修正すると以下の通りです。

[code]

    using Android.App;
    using Android.Views;
    using Android.Widget;
    using Android.OS;
    
    namespace App.Droid
    {
        [Activity(Label = "AndroidApp5", MainLauncher = true, Icon = "@drawable/icon")]
        public class MainActivity : BaseActivity
        {
            private const int WrapContent = ViewGroup.LayoutParams.WrapContent;
    
            protected override void OnCreate(Bundle bundle)
            {
                base.OnCreate(bundle);
    
                var linearLayout = new LinearLayout(this);
                linearLayout.Orientation = Orientation.Vertical;
                SetContentView(linearLayout);
    
                var parameter = new LinearLayout.LayoutParams(WrapContent, WrapContent);
    
                var button1 = new Button(this);
                linearLayout.AddView(button1, parameter);
    
                var button2 = new Button(this);
                linearLayout.AddView(button2, parameter);
            }
        }
    }
    
[/code]

Xamarin は Android SDK の Java API を直訳せず、C# をやっている人にとって分かりやすい API
となるよう再設計しています。このため、Android SDK と C# の両方をある程度理解していないと、どう翻訳されているのか分かりにくい部分があります。

もし Java がある程度分かるのであれば、C# について学びつつ、Xamarin
の[リファレンス](https://developer.xamarin.com/api/type/Android.App.Activity/)を参照して、どのメソッドがどう対応付けられているのか調べながらコーディングするのがお勧めです。

C# も Java も不明点が多いのであれば、まずはサンプルコードの多い Android Java から始めるというのがお勧めかもしれません。


CC BY-SA 3.0
2016-08-21T02:24:13.780
28403
2016-08-21T09:43:53.347
2016-08-21T09:43:53.347
5337
5337
28400
answer