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

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

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

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

3500閲覧

Android:EditTextのフォーカスがナビゲーションドロワーの表示では外れなくなった

tsu

総合スコア6

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/04/11 05:22

編集2022/01/12 10:55

###前提・実現したいこと
ナビゲーションドロワーとフラグメントの組み合わせでアプリを開発しています。
フラグメントの画面にEditTextを置き、フォーカスがある場合にはIMEを表示し、フォーカスが外れた場合はIMEを非表示にしており、ナビゲーションドロワーを開いたときにもIMEを非表示にしたいと考えています。

###発生している問題・エラーメッセージ
フォーカスが外れたかどうかは OnFocusChangeListener() でキャッチしているのですが、ナビゲーションドロワーを開いても onFocusChange のイベントが発生せず(※)、IMEを非表示にすることができません。
※AndroidStudioのデバッグモードでリスナー内にブレークポイントを設定して確認。
###該当のソースコード

xml

1<!-- 2test_fragment.xml 3--> 4<?xml version="1.0" encoding="utf-8"?> 5<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 6 android:orientation="vertical" android:layout_width="match_parent" 7 android:layout_height="match_parent"> 8 <EditText 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:inputType="textImeMultiLine" 12 android:imeOptions="actionGo" 13 android:selectAllOnFocus="true" 14 android:id="@+id/edtext" 15 android:hint="テキストを入力" 16 > 17 <requestFocus/> 18 </EditText> 19</LinearLayout>

java

1/** 2TestFragment.java 3**/ 4 public class TestFragment extends Fragment { 5 // 以下、onStart()まで省略 6 @Override 7 public void onStart() { 8 super.onStart(); 9 10 // IMEをON 11 EditText edText = (EditText)getView().findViewById(R.id.edtext); 12 ((InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(edText, 0); 13 14 // リスナー:フォーカスを失った場合 15 edText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 16 @Override 17 public void onFocusChange(View v, boolean hasFocus) { 18 if (hasFocus) { 19 // Focus on 20 } else { 21 // Focus off 22 ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0); 23 } 24 } 25 }); 26 } 27}

java

1/** 2MainActivity.java 3**/ 4public class MainActivity extends AppCompatActivity 5 implements NavigationView.OnNavigationItemSelectedListener { 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 // 以下、フラグメント画面表示まで省略 11 FragmentManager fragmentManager = getSupportFragmentManager(); 12 FragmentTransaction sc = fragmentManager.beginTransaction(); 13 TestFragment test_fragment = new TestFragment(); 14 sc = fragmentManager.beginTransaction(); 15 sc.replace(R.id.container, test_fragment, "test_fragment"); 16 sc.commit(); 17 } 18//以下、省略
/** build.gradle(Project: NaviDrawAndFocusTest1) **/ buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
/** build.gradle(Module: app) **/ apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.hogehoge.navidrawandfocustest1" minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support:design:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' }
/** gradle-warapper.properties **/ #Tue Apr 11 11:25:21 JST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

###試したこと
(1)上記の再現確認用ソースコードによって本件再現を確かめました。
(2)ナビゲーションドロワーのitemを選択して他のフラグメント画面に遷移した場合にはonFocusChangeイベントが発生することも確認しました。
(3)開発中のアプリのプロト版をAndroidStudio2.2.xで開発したのですが、その際には本件は発生せず、同プロジェクトをAndroidStudio2.3.1環境でリビルド&実行しても本件は発生しませんでした。
(4)AndroidStudio2.3.1環境で全く同じ名称のプロジェクトを生成して、(3)のプロジェクトからソースコード(Javaとレイアウトのxml)を変更を加えずに移植してみたところ、本件が発生しました。
以上のことから、AndroidStudioかSDKの版の違いの影響や仕様変更かとも考え、ネットで検索して見ましたが、該当する事例は発見できませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
発生時の環境は下記です。
IDE:AndroidStudio2.3.1
minimun API:API16 を指定
テンプレート:Navigation Drawer Activity

以上、よろしくお願いいたします。

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

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

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

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

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

yona

2017/04/11 05:38

gradleの内容を質問に追記してください。
yona

2017/04/11 06:09

コードはファイル単位に分割して記載してください。
guest

回答1

0

変わったのかどうかは分かりませんが、私の環境(AndroidStudio2.3.1)ではドロワーによるイベントは発生しませんでした。

本題ですが、ナビゲーションドロワーを開いた時にIMEを非表示にしたいという事ですので
単純にDrawerListeneronDrawerOpenedでドロワーが開いた時にフォーカスが当たっていれば外すという様にするのはいかがでしょうか。

Navigation Drawer Activityを利用している様ですので以下の様にコードが変わります。
*環境によっては違うかもしれません。。

ソースは省略されていますが、見る限り場所は多分MainActivity.javaですかね。
そもそもやりたい事が間違っていましたらすいません。

java

1DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 2ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( 3 this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 4drawer.setDrawerListener(toggle);

↓ こちらへ変更

java

1DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 2ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( 3 this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close){ 4 5 @Override 6 public void onDrawerOpened(View drawerView) { 7 super.onDrawerOpened(drawerView); 8 //ドロワーが開いた時 9 //ここでEditTextのフォーカスを外す処理を行う。 10 } 11 12 13 //以下はいらないですが他に使いたい時があれば参考に 14 @Override 15 public void onDrawerClosed(View drawerView) { 16 super.onDrawerClosed(drawerView); 17 //ドロワーが閉じた時 18 } 19 20 @Override 21 public void onDrawerStateChanged(int newState) { 22 super.onDrawerStateChanged(newState); 23 //ドロワーの状態が変わった時でnewStateの内容は以下を 24 //DrawerLayout.STATE_IDLE : 0 25 //動いていない状態 = 表示/非表示時 26 //DrawerLayout.STATE_DRAGGING : 1 27 //ドラッグ中 28 //DrawerLayout.STATE_SETTLING : 2 29 //ドラッグを離した後のアニメーション中 30 } 31}; 32//drawer.setDrawerListener(toggle); これはdeprecatedになったのでaddDrawerListenerに 33drawer.addDrawerListener(toggle);

投稿2017/04/16 14:23

編集2017/04/16 14:30
uniko

総合スコア448

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問