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

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

ただいまの
回答率

91.78%

  • Android

    4508questions

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

  • C#

    3869questions

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

  • Xamarin

    251questions

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

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

解決済

回答 2

投稿 2016/08/31 18:55 ・編集 2016/09/01 14:45

  • 評価
  • クリップ 0
  • VIEW 753

tokage

score 2

前提・実現したいこと

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

試したこと

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

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

//変更前
//Activityクラス
namespace Tes
{
    [Activity(Label = "Tes", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.Main);


            Button button1 = FindViewById(Resource.Id.button1);
            button.SetOnClickListener(listener); //エラー Listenerの定義宣言方法が分からず

            Button button2 = FindViewById(Resource.Id.button2);
            button.SetOnClickListener(listener); //エラー 同上
        }

        public void onClick(View v)
        {
            switch (v.GetID())//GetIDがエラー ID取得方法が分からず
            {
                case Resource.Id.button01:
                    //メソット1実行予定
                    break;
                case Resource.Id.button02:
                    //メソット2実行予定
                    break;
            }
        }
}

//Viewクラス Android.Views.View
namespace Tes
{
    class View_C : View
    {
        //略
        public View_C(Context context) : base(context)
        {
                //略
        }
         public override void Draw(Canvas canvas)
        {
            canvas.DrawBitmap(Img000, Rect1, Rect2, null);
        }
     }
}

追記

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

//仮作成
//MainActivity.cs
namespace jpeg2000test
{
    [Activity(Label = "jpeg2000test", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            RequestWindowFeature(WindowFeatures.NoTitle);

            SetContentView(Resource.Layout.Main);

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

//View_C.cs
namespace jpeg2000test
{
    [Register("jpeg2000testp.jpeg2000test.View_C")]
    public class View_C : View
    {
        //略
        public View_C(Context context) : base(context)
        {
            //略
        }

        public override void Draw(Canvas canvas)
        {
            //canvas.DrawBitmap(Img000, Rect1, Rect2, null);
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

button.SetOnClickListener(listener);

ではなくて

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

な感じでいけませんか?

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

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

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:p1="http://schemas.android.com/apk/res/android"
    p1:minWidth="25px"
    p1:minHeight="25px"
    p1:layout_width="fill_parent"
    p1:layout_height="fill_parent"
    p1:id="@+id/relativeLayout1">
    <jpeg2000test.jpeg2000test.View_C
        p1:layout_width="match_parent"
        p1:layout_height="match_parent" />
    <Button
        p1:layout_marginLeft="200.0dp"
        p1:layout_marginTop="200.0dp"
        p1:layout_width="200dp"
        p1:layout_height="70dp"
        p1:id="@+id/btnOne"
        p1:textSize="30dp"
        p1:text="ボタン"
        />
</RelativeLayout>

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

イメージ

投稿 2016/08/31 19:53

編集 2016/09/01 01:24

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/08/31 20:07

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

    キャンセル

  • 2016/09/01 14:47

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

    キャンセル

  • 2016/09/01 15:34

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

    キャンセル

  • 2016/09/01 15:38

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

    キャンセル

0

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

using Android.App;
using Android.Views;
using Android.Widget;
using Android.OS;

namespace App
{
    [Activity(Label = "App", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        viewClass V;

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

            V = new viewClass(this);

            SetContentView(V);

            View Main = LayoutInflater.Inflate(Resource.Layout.Main, null);

            AddContentView(Main, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent,
                           WindowManagerLayoutParams.MatchParent));

            Button button = FindViewById<Button>(Resource.Id.MyButton);

            button.Click += delegate { V.switchMethod(); };
        }
    }
}
using Android.Content;
using Android.Graphics;
using Android.Views;

namespace App
{
    class viewClass:View
    {
        Bitmap Img000 = null;

        Rect ClipRect = new Rect();
        Rect PosRect = new Rect();

        int switchNum = 0;

        public viewClass(Context context) : base(context)
        {
            var img000 = context.Resources.GetIdentifier("img000", "drawable", context.PackageName);
            Img000 = BitmapFactory.DecodeResource(context.Resources, img000);
        }

        public override void Draw(Canvas canvas)
        {
            base.Draw(canvas);

            ClipRect = new Rect(switchNum * 240, 0, (switchNum * 240) + 240, 240);

            PosRect = new Rect(100, 100, 500, 500);

            canvas.DrawBitmap(Img000, ClipRect, PosRect, null);
        }

        public void switchMethod()
        {
            if (switchNum == 0)
            {
                switchNum = 1;
            }
            else
            {
                switchNum = 0;
            }

            Invalidate();
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/frame">
    <Button
        android:id="@+id/MyButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center"
        android:text="Button" />
</FrameLayout>

投稿 2016/09/26 19:47

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

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

ただいまの回答率

91.78%

関連した質問

同じタグがついた質問を見る

  • Android

    4508questions

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

  • C#

    3869questions

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

  • Xamarin

    251questions

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

閲覧数の多いC#の質問