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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Xamarin

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

Q&A

解決済

1回答

506閲覧

(Xamarin.Forms) Android API28以降で、アプリ起動時にアプリにフォーカスを当てたい

tesangam

総合スコア2

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Xamarin

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

0グッド

0クリップ

投稿2023/02/06 00:46

編集2023/02/06 02:35

実現したいこと

Visual Studio 2017(API28)以降のXamarin.Formsで、アプリ起動時にアプリ全体にフォーカスが当たらなくなってしまいました。DispatchKeyEvent()で最初のACTION=KEYDOWNが取れず、ACTION=KEYUPのみとなってしまいます。

API27以前はアプリ起動時アプリ全体にフォーカスが当たるので、ACTION=KEYDOWN/ACTION=KEYUP両方が取得できます。

この動作の違いで、これまでのアプリが同様に動かず困っています。

Q. API28以降でも、アプリ起動時にアプリ全体にフォーカスを与える方法がないでしょうか?

前提

少し古い開発環境の質問で恐縮です。
Xamarin.FormsでAndroidアプリを開発しております。
Visual Studio 2015(API27以下)で開発した古いアプリをVisual Studio 2017以降(API28以上)に移植したいと考えています。

ターゲット端末は、ハードウェアキーボード付きのAndroid端末(ハンディターミナルと言われるもの)です。

アプリは、初期起動画面がEntryやButtonなどがない画面となっており、ハンディターミナルのハードウェアキーで数字や矢印キーを押して、DispatchKeyEvent()で入力イベント・キーを取得して処理を進めるようになっています。

該当のソースコード

簡単に比較できるよう、Visual Studio2017でブランクのXamarin.Formsアプリを作り試しました。ハードウェアキーボードの部分は、Bluetooth外付けキーボード等でも同じ動作となります。

★API27(Android8.1)でビルドすると、アプリ起動時にアプリ全体(StackLayout箇所)にフォーカスが当たり、ハードウェアキーボードを押すとaction=ACTION_DOWN/action=ACTION_UP両方でキーイベントを取ることができました。
(アプリ起動時↓)
イメージ説明

★API28(Android9)以降でビルドすると、アプリ起動時にアプリ全体(StackLayout箇所)にフォーカスが当たらず、ハードウェアキーボードを押してもaction=ACTION_DOWNでキーイベントを取れません。Action=ACTION_UPのみ取得できます。
ACTION_DOWNでアプリ全体にフォーカスが当たり、ACTION_UPのみアプリで取得できているイメージです。
(アプリ起動時↓)
イメージ説明
(キー押下後↓)
イメージ説明

試したこと

Androidの開発ドキュメント等も読みましたが、フォーカスについての変更点はAPI28(Android9)にはありませんでした。それ以前のAPI26(Andorid8.0)ではフォーカスの仕様変更の記述がありましたが、現象とは一致しません。
View のフォーカス

何とぞご教授のほどよろしくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

自己解決

完全ではないですが、自己解決しました。

まず、Android9(API28)以降は、タップモードとタップモード以外(キーボード操作)で動作モードが変わるため、フォーカス遷移を自分で行う必要があると記述がありました。
リンク

このため、初期画面のStackLayoutにダミーでカスタムラベルを配置し、カスタムラベル内でフォーカス可能なプロパティ「FocusableInTouchMode」をTrueに設定しました。
アプリ起動時に、FormのOnAppearing()イベントにてそのカスタムラベルにフォーカスを与えることで、初期フォーカスを得ることを確認しました。

C#

1protected async override void OnAppearing() 2{ 3 base.OnAppearing(); 4 await Task.Run(async () => 5 { 6 await Task.Delay(100); 7 Device.BeginInvokeOnMainThread(async () => 8 { 9 Dummy_View.Focus(); 10 }); 11 }); 12}

Xamarin.Formsのみ現象発生し、Xamarin.AndroidやJavaでは現象発生しない原因はわかりませんでしたが、この方針で対処を進めようと考えています。

自己解決には「Xamarin.Forms」「FocusableInTouchMode」「API28」などをキーワードにして検索して情報を得ました。

この質問を見てくださった方、ありがとうございました。

投稿2023/02/14 04:45

tesangam

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問