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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

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

Q&A

解決済

2回答

4600閲覧

Xamarin.Android(C#)でCanvas上にButtonを設置する方法

tokage

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

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

0グッド

0クリップ

投稿2016/08/31 09:55

編集2016/09/01 05:45

###前提・実現したいこと
Xamarin.Android(C#)でCanvas上にButtonを設置する方法を教えてください。
主に、MainActivity.scに当たる部分をお願いします。

###試したこと
[Android Canvas Button] をgoogl検索し、見つけたサイトを
参考にしてみたのですが、javaのもので、
主にOnClickListener周り?が
C#と構文が違うのか、エラーになってしまいます。

また、注意点や、この方法より効率の良い方法がありましたら、
ご教授いただきたいです。
以下はサイトを参考に作成した、エラーする現在のC#コードです。

C#

1//変更前 2//Activityクラス 3namespace Tes 4{ 5 [Activity(Label = "Tes", MainLauncher = true, Icon = "@drawable/icon")] 6 public class MainActivity : Activity 7 { 8 protected override void OnCreate(Bundle bundle) 9 { 10 base.OnCreate(bundle); 11 12 SetContentView(Resource.Layout.Main); 13 14 15 Button button1 = FindViewById(Resource.Id.button1); 16 button.SetOnClickListener(listener); //エラー Listenerの定義宣言方法が分からず 17 18 Button button2 = FindViewById(Resource.Id.button2); 19 button.SetOnClickListener(listener); //エラー 同上 20 } 21 22 public void onClick(View v) 23 { 24 switch (v.GetID())//GetIDがエラー ID取得方法が分からず 25 { 26 case Resource.Id.button01: 27 //メソット1実行予定 28 break; 29 case Resource.Id.button02: 30 //メソット2実行予定 31 break; 32 } 33 } 34} 35 36//Viewクラス Android.Views.View 37namespace Tes 38{ 39 class View_C : View 40 { 41 //略 42 public View_C(Context context) : base(context) 43 { 44 //略 45 } 46 public override void Draw(Canvas canvas) 47 { 48 canvas.DrawBitmap(Img000, Rect1, Rect2, null); 49 } 50 } 51}

###追記

xmlファイルの
<jpeg2000testp.jpeg2000test.View_C
の部分で「要素RelativeLayoutには無効な子要素~」
というエラーが出てきてしまいました。
これがxamarinのバージョンの差の違い部分でしょうか?
頂いたxmlをそのまま使えるように作成したプログラムを記載しますので、
確認していただけますか?
xamarin.andoroidのバージョンは6.1.0.71でした。

C#

1//仮作成 2//MainActivity.cs 3namespace jpeg2000test 4{ 5 [Activity(Label = "jpeg2000test", MainLauncher = true, Icon = "@drawable/icon")] 6 public class MainActivity : Activity 7 { 8 protected override void OnCreate(Bundle bundle) 9 { 10 base.OnCreate(bundle); 11 12 RequestWindowFeature(WindowFeatures.NoTitle); 13 14 SetContentView(Resource.Layout.Main); 15 16 btnOne.Click += (object sender, EventArgs e) => { 17 //ここに処理 18 }; 19 } 20 } 21} 22 23//View_C.cs 24namespace jpeg2000test 25{ 26 [Register("jpeg2000testp.jpeg2000test.View_C")] 27 public class View_C : View 28 { 29 //略 30 public View_C(Context context) : base(context) 31 { 32 //略 33 } 34 35 public override void Draw(Canvas canvas) 36 { 37 //canvas.DrawBitmap(Img000, Rect1, Rect2, null); 38 } 39 } 40} 41

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

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

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

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

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

guest

回答2

0

いろいろ試したところ、上手なやり方なのかは判断できませんが、
AddContentViewを使用するやり方を見つけましたので投稿します。
viewClass(Android.Views.View)の上にMain.axmlが重なっている状態です。
画面下に表示されるボタンを押すと、横方向に画像が切り替わります。
※使用した画像は横160px、縦80pxのものです。
※実行した端末は480dpiです。

C#

1using Android.App; 2using Android.Views; 3using Android.Widget; 4using Android.OS; 5 6namespace App 7{ 8 [Activity(Label = "App", MainLauncher = true, Icon = "@drawable/icon")] 9 public class MainActivity : Activity 10 { 11 viewClass V; 12 13 protected override void OnCreate(Bundle bundle) 14 { 15 base.OnCreate(bundle); 16 17 V = new viewClass(this); 18 19 SetContentView(V); 20 21 View Main = LayoutInflater.Inflate(Resource.Layout.Main, null); 22 23 AddContentView(Main, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, 24 WindowManagerLayoutParams.MatchParent)); 25 26 Button button = FindViewById<Button>(Resource.Id.MyButton); 27 28 button.Click += delegate { V.switchMethod(); }; 29 } 30 } 31}

C#

1using Android.Content; 2using Android.Graphics; 3using Android.Views; 4 5namespace App 6{ 7 class viewClass:View 8 { 9 Bitmap Img000 = null; 10 11 Rect ClipRect = new Rect(); 12 Rect PosRect = new Rect(); 13 14 int switchNum = 0; 15 16 public viewClass(Context context) : base(context) 17 { 18 var img000 = context.Resources.GetIdentifier("img000", "drawable", context.PackageName); 19 Img000 = BitmapFactory.DecodeResource(context.Resources, img000); 20 } 21 22 public override void Draw(Canvas canvas) 23 { 24 base.Draw(canvas); 25 26 ClipRect = new Rect(switchNum * 240, 0, (switchNum * 240) + 240, 240); 27 28 PosRect = new Rect(100, 100, 500, 500); 29 30 canvas.DrawBitmap(Img000, ClipRect, PosRect, null); 31 } 32 33 public void switchMethod() 34 { 35 if (switchNum == 0) 36 { 37 switchNum = 1; 38 } 39 else 40 { 41 switchNum = 0; 42 } 43 44 Invalidate(); 45 } 46 } 47}

axml

1<?xml version="1.0" encoding="utf-8"?> 2<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:id="@+id/frame"> 6 <Button 7 android:id="@+id/MyButton" 8 android:layout_width="match_parent" 9 android:layout_height="wrap_content" 10 android:layout_gravity="bottom|center" 11 android:text="Button" /> 12</FrameLayout>

投稿2016/09/26 10:47

tokage

総合スコア10

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

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

0

ベストアンサー

button.SetOnClickListener(listener);

ではなくて

C#

1 button1.Click += (object sender, EventArgs e) => { 2 //ここに処理 3 };

な感じでいけませんか?

追記
気になって確認したところ、上記の処理で動きました。

Xamarin.Android(C#)でCanvas上にButtonを設置する方法を教えてください。

が主な質問と思いますが、axmlを以下の様な感じ(位置とかは気にしないでください)でいけました。

axml

1<?xml version="1.0" encoding="utf-8"?> 2<RelativeLayout xmlns:p1="http://schemas.android.com/apk/res/android" 3 p1:minWidth="25px" 4 p1:minHeight="25px" 5 p1:layout_width="fill_parent" 6 p1:layout_height="fill_parent" 7 p1:id="@+id/relativeLayout1"> 8 <jpeg2000test.jpeg2000test.View_C 9 p1:layout_width="match_parent" 10 p1:layout_height="match_parent" /> 11 <Button 12 p1:layout_marginLeft="200.0dp" 13 p1:layout_marginTop="200.0dp" 14 p1:layout_width="200dp" 15 p1:layout_height="70dp" 16 p1:id="@+id/btnOne" 17 p1:textSize="30dp" 18 p1:text="ボタン" 19 /> 20</RelativeLayout>

CustomViewを記述する方法が、バージョンによってちょっと違うようなので気をつけたほうが良さそうです。
https://forums.xamarin.com/discussion/comment/122750/#Comment_122750

イメージ

投稿2016/08/31 10:53

編集2016/08/31 16:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/08/31 11:07

ごめんなさい。この回答正しくないです。 viewの上にというのを見落としていました。
tokage

2016/09/01 05:47

申し訳ありません。上手くいかないので 恐縮ですがもう少しだけお付き合いください
退会済みユーザー

退会済みユーザー

2016/09/01 06:34

すみません、正直わかりません。 私はちょっと引っかかったのが、確認したらPackage Nameが思っているのと違ってたってところです。 試行錯誤することをおすすめします。 Xamarin.Studioを使用しているのですが、一度、[Registerほげほげ]としたものが変更後リビルトしないと反映しなかったので、そちらも注意です。VSではどうかわかりません。
tokage

2016/09/01 06:38

ではもう少し調べてみます。お手数おかけしました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問