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

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

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

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

Android

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

Xamarin

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

Q&A

解決済

1回答

3217閲覧

OnTouchを複数のボタンで使用したい

nasama

総合スコア16

C#

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

Android

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

Xamarin

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

0グッド

0クリップ

投稿2016/12/12 14:37

編集2016/12/15 15:05

###前提・実現したいこと
以前、StackOverflowでOnTouchでボタンの長押しをした時の処理の書き方を教えてもらい、その内容を元に、
同様の動きをするボタンが複数あり、ボタンごとに別の変数のカウントアップorダウンができるように作り変えたいと思っています。
現在のプログラムは以下の通りです。

###該当のソースコード

using System; using System.Diagnostics; using Android.App; using Android.OS; using Android.Views; using Android.Widget; namespace test2 { [Activity(Label = "test2", MainLauncher = true, Icon = "@mipmap/icon")] public class MainActivity : Activity, View.IOnTouchListener { System.Threading.CancellationTokenSource cancellationTokenSource; int count = 1; private Button button; private Button button2; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); // Get our button from the layout resource, // and attach an event to it button = FindViewById<Button>(Resource.Id.myButton); button2 = FindViewById<Button>(Resource.Id.myButton2); TextView text = new TextView(this); //text = FindViewById<TextView>(Resource.Id.Text); button.SetOnTouchListener(this); button2.SetOnTouchListener(this); } public bool OnTouch(View v, MotionEvent e) { switch (e.Action) { case MotionEventActions.Down: button.Text = string.Format("{0} clicks!", v.Id); if(cancellationTokenSource != null) break; cancellationTokenSource = new System.Threading.CancellationTokenSource(); var token = cancellationTokenSource.Token; System.Threading.Tasks.Task.Factory.StartNew(() => { var stopwatch = Stopwatch.StartNew(); while (stopwatch.ElapsedMilliseconds < 1000 && token.IsCancellationRequested == false) { System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(10)).Wait(); } while (token.IsCancellationRequested == false) { RunOnUiThread(() => { button.Text = string.Format("{0} clicks!", count++); }); System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(100)).Wait(); } }, token) .ContinueWith(_ => { cancellationTokenSource.Dispose(); cancellationTokenSource = null; }); break; case MotionEventActions.Up: if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); } break; } return true; } } }

現在、button1とbutton2を作りswitchでそれぞれのボタンの分岐処理を作ろうと考えておりますが、どのようにしてそれぞれのボタンの違いを認識させればよいかわからず詰まっています。
色々と試し、記載されているプログラムを実行し、button1を押すと「2131034112 CLICKS!」button2を押すと「2131034113 CLICKS!」とボタンに表示されるところまではできました
(本来であればTextViewなどに表示させた方がわかりやすいのですが、「text.Text = v.Id.ToString();」と書こうとすると何故かエラーが出てしまうのでボタンに表示させています)。
このIdなのですが、現在ボタンを押したときに得られるIdというのは不変なのでしょうか?
switchで分岐させる場合は

switch (v.Id) { case 2131034112: ............. break; } switch (v.Id) { case 2131034113: ............. break; }

こんな感じでいいのでしょうか?
サンプルコードとか色々見ましたが変数名とかが記載してあるのがほとんどだったと思うので気になり投稿しました。

###追記(12/15)
回答ありがとうございます。
教えていただいたコードを使用させていただきました。

しかし、通常のtouch動作であれば作成できましたが、
MotionEvent を検知できないようで、長押しができなくなってしまいました。
そのためonTouchから入れて試しましたが、どこに}を足してもエラーが出て詰まってしまいます。
Xamarin Studioのクイック修正を使用しエラーを潰しましたが、取りきれないエラーが数多くあり、動作確認ができない状況です。

###追記2(12/15)
コメントありがとうございます。
e.Event.Actionを使用することでe.Actionと同様の動きができました。
それにより、実現したい動作を作成することができました。ありがとうございました!

修正後の内容は以下のコードです。

using System; using System.Diagnostics; using Android.App; using Android.OS; using Android.Views; using Android.Widget; namespace test2 { [Activity(Label = "test2", MainLauncher = true, Icon = "@mipmap/icon")] public class MainActivity : Activity { System.Threading.CancellationTokenSource cancellationTokenSource; int count = 1; int count2 = 1; private Button button; private Button button2; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); // Get our button from the layout resource, // and attach an event to it button = FindViewById<Button>(Resource.Id.myButton); button2 = FindViewById<Button>(Resource.Id.myButton2); TextView text = new TextView(this); //text = FindViewById<TextView>(Resource.Id.Text); button.Touch += (object sender, View.TouchEventArgs e) => { switch (e.Event.Action) { case MotionEventActions.Down: button.Text = string.Format("{0} clicks!",count++); if (cancellationTokenSource != null) break; cancellationTokenSource = new System.Threading.CancellationTokenSource(); var token = cancellationTokenSource.Token; System.Threading.Tasks.Task.Factory.StartNew(() => { var stopwatch = Stopwatch.StartNew(); while (stopwatch.ElapsedMilliseconds < 1000 && token.IsCancellationRequested == false) { System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(10)).Wait(); } while (token.IsCancellationRequested == false) { RunOnUiThread(() => { button.Text = string.Format("{0} clicks!", count++); }); System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(100)).Wait(); } }, token) .ContinueWith(_ => { cancellationTokenSource.Dispose(); cancellationTokenSource = null; }); break; case MotionEventActions.Up: if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); } break; } }; button2.Touch += (object sender, View.TouchEventArgs e) => { switch (e.Event.Action) { case MotionEventActions.Down: button2.Text = string.Format("{0} clicks!",count2++); if (cancellationTokenSource != null) break; cancellationTokenSource = new System.Threading.CancellationTokenSource(); var token = cancellationTokenSource.Token; System.Threading.Tasks.Task.Factory.StartNew(() => { var stopwatch = Stopwatch.StartNew(); while (stopwatch.ElapsedMilliseconds < 1000 && token.IsCancellationRequested == false) { System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(10)).Wait(); } while (token.IsCancellationRequested == false) { RunOnUiThread(() => { button2.Text = string.Format("{0} clicks!", count2++); }); System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(100)).Wait(); } }, token) .ContinueWith(_ => { cancellationTokenSource.Dispose(); cancellationTokenSource = null; }); break; case MotionEventActions.Up: if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); } break; } }; } } }

※文字数制限に引っかかったので前回のコードは消しました

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

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

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

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

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

guest

回答1

0

ベストアンサー

C#

1button.SetOnTouchListener(this); 2button2.SetOnTouchListener(this);

ではなくて、

C#

1button.Touch += (object sender, View.TouchEventArgs e) => { 2//ここに処理 3}; 4button2.Touch += (object sender, View.TouchEventArgs e) => { 5//ここに処理 6};

な感じでいけませんか?

投稿2016/12/13 02:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nasama

2016/12/15 10:27

回答ありがとうございます。 教えていただいた内容を元に修正いたしました。 よろしければご確認ください。
退会済みユーザー

退会済みユーザー

2016/12/15 11:06

e.Event.Actionで拾えると思いますが。。。 その前に基本的なところを学習したほうが良いように思えます。
nasama

2016/12/15 15:08

e.Event.Actionで拾えました。お手数おかけいたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問