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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Q&A

解決済

2回答

5682閲覧

SpinnerのOnItemSelectedが呼ばれない

1129

総合スコア121

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

0グッド

0クリップ

投稿2017/07/31 09:29

編集2017/08/01 04:59

###前提・実現したいこと
現在作っているアプリで、ダイアログの中にスピナーを設置しました。
しかし、OnItemSelectedリスナーを設定したのにも関わらず、項目をタッチしたときこのメソッドが呼ばれませんでした。
どのようにすれば正しく反応してくれるのでしょうか。
OnResume()の時の一回だけは反応します。(無効化済み)
足りない点などがありましたら修正・追加します

###ソースコード

少し長くなってしまいました。

MainActivity.java

java

1package com.example.spinnertest; 2 3//import省略 4 5public class MainActivity extends AppCompatActivity { 6 public CustomizedDialog_questionbook customizedDialog_questionbook; 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_main); 12 13 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 14 customizedDialog_questionbook = new CustomizedDialog_questionbook(); 15 fab.setOnClickListener(new View.OnClickListener() { 16 17 @Override 18 public void onClick(View view) { 19 customizedDialog_questionbook.show(getFragmentManager(), "dialog_fragment"); 20 } 21 }); 22 } 23 24} 25 26

CustomizedDialog_questionbook.java

java

1package com.example.spinnertest; 2 3//import省略 4 5public class CustomizedDialog_questionbook extends DialogFragment { 6 private Spinner tagSpinner; 7 private ArrayAdapter<String> tagSpinnerAdapter; 8 private Dialog dialog; 9 public DialogListener dialogListener; 10 @Override 11 public void onViewCreated(View view, Bundle savedInstanceState) { 12 super.onViewCreated(view, savedInstanceState); 13 14 view.findViewById(R.id.ok_Button).setOnClickListener(new View.OnClickListener() { 15 @Override 16 public void onClick(View v) { 17 if (dialogListener != null) { 18 dialogListener.onClickOk(); 19 } 20 } 21 }); 22 } 23 24 @Override 25 public void onAttach(Context context) { 26 super.onAttach(context); 27 if (context instanceof DialogListener) { 28 dialogListener = (DialogListener) context; 29 } 30 } 31 32 @Override 33 public void onDetach() { 34 super.onDetach(); 35 dialogListener = null; 36 } 37 38 @Override 39 public Dialog onCreateDialog(final Bundle savedInstanceState) { 40 LayoutInflater inflater = getActivity().getLayoutInflater(); 41 View view = inflater.inflate(R.layout.inputdialog, null, false); 42 43 tagSpinnerAdapter = new ArrayAdapter<>(MyApplication.getAppContext(), android.R.layout.simple_spinner_item); 44 tagSpinnerAdapter.add("【新規作成】"); 45 tagSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 46 47 tagSpinner = (Spinner) view.findViewById(R.id.tagSpinner); 48 tagSpinner.setAdapter(tagSpinnerAdapter); 49 tagSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 50 @Override 51 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 52 53 if (tagSpinner.isFocusable() == false) {//OnResume()の時かどうか判定 54 tagSpinner.setFocusable(true); 55 Log.d("onqbook","初回起動"); //←呼ばれる 56 } else { 57 if (position == 0) { 58 //ダイアログ作成 59 Log.d("onqbook","ダイアログ作成"); //←呼ばれない!!! 60 } else { 61 Log.d("onqbook","ファイルに書き込み");//←呼ばれなくて良い 62 } 63 } 64 } 65 @Override 66 public void onNothingSelected(AdapterView<?> parent) { 67 // do nothing 68 } 69 }); 70 tagSpinner.setSelection(0,false); 71 tagSpinnerAdapter.notifyDataSetChanged(); 72 tagSpinner.setFocusable(false); 73 74 Button okButton = (Button) view.findViewById(R.id.ok_Button); 75 Button closeButton = (Button) view.findViewById(R.id.close_Button); 76 dialog = new Dialog(getActivity()); 77 dialog.setTitle("編集画面"); 78 dialog.setContentView(view); 79 80 okButton.setOnClickListener(new View.OnClickListener(){ 81 public void onClick(View v){ 82 // do something 83 dialog.dismiss(); 84 } 85 }); 86 closeButton.setOnClickListener(new View.OnClickListener(){ 87 public void onClick(View v){ 88 dialog.dismiss(); 89 } 90 }); 91 return dialog; 92 } 93 @Override 94 public void onActivityCreated(Bundle savedInstansState){ 95 super.onActivityCreated(savedInstansState); 96 WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); 97 DisplayMetrics metrics = getResources().getDisplayMetrics(); 98 lp.width = (int) (metrics.widthPixels*1.0); 99 dialog.getWindow().setAttributes(lp); 100 } 101 102}

MyApplication.java

java

1package com.example.spinnertest; 2 3import android.app.Application; 4import android.content.Context; 5 6public class MyApplication extends Application { 7 public static Context context; 8 9 public void onCreate(){ 10 super.onCreate(); 11 MyApplication.context = getApplicationContext(); 12 } 13 14 public static Context getAppContext() { 15 return MyApplication.context; 16 } 17} 18

DialogListener.java(インターフェース)

java

1package com.example.spinnertest; 2 3 4 interface DialogListener { 5void onClickOk(); 6} 7

activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context="com.example.spinnertest.MainActivity"> 8 9 <android.support.design.widget.AppBarLayout 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:theme="@style/AppTheme.AppBarOverlay"> 13 14 </android.support.design.widget.AppBarLayout> 15 16 <include layout="@layout/content_main" /> 17 18 <android.support.design.widget.FloatingActionButton 19 android:id="@+id/fab" 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:layout_gravity="bottom|end" 23 android:layout_margin="@dimen/fab_margin" 24 app:srcCompat="@android:drawable/ic_dialog_email" /> 25 26</android.support.design.widget.CoordinatorLayout> 27

content_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 app:layout_behavior="@string/appbar_scrolling_view_behavior" 8 tools:context="com.example.spinnertest.MainActivity" 9 tools:showIn="@layout/activity_main"> 10 11 12 13</android.support.constraint.ConstraintLayout>

inputdialog.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:id="@+id/customDialog" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:weightSum="1"> 8 9 10 <Spinner 11 android:id="@+id/tagSpinner" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" 14 android:layout_weight="0.10" 15 /> 16 17 <LinearLayout 18 android:layout_weight="0.60" 19 android:layout_width="match_parent" 20 android:layout_height="wrap_content"> 21 22 <Button 23 android:id="@+id/close_Button" 24 style="?android:attr/buttonBarButtonStyle" 25 android:layout_width="match_parent" 26 android:layout_height="match_parent" 27 android:layout_weight="1" 28 android:text="close" /> 29 30 <Button 31 style="?android:attr/buttonBarButtonStyle" 32 android:id="@+id/ok_Button" 33 android:layout_width="match_parent" 34 android:layout_height="match_parent" 35 android:layout_weight="1" 36 android:text="Ok" /> 37 </LinearLayout> 38</LinearLayout>

###試したこと
spinner.setselection(0, false)
arrayadapter.notifyDataSetChanged()
###補足情報
Android Studio 2.3.3
実機:Android 6.0.0
###追記
修正版 CustomizedDialog_questionbook.java

java

1tagSpinner.setAdapter(tagSpinnerAdapter); 2tagSpinner.setSelection(0,false); 3 tagSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 4 //略 5 }); 6 tagSpinnerAdapter.notifyDataSetChanged(); 7 //tagSpinner.setFocusable(false);

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

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

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

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

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

guest

回答2

0

自己解決

自分でSpinnerAdapterを継承したカスタムアダプターを作る事により解決しました。
スピナーにすでに選択されているアイテムが再び選択されてもOnItemSelected()は呼ばれないようです。
詳しくはStackOverFlowにありました。

投稿2017/09/02 09:17

1129

総合スコア121

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

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

0

setSelectionメソッドの呼び出しをsetOnItemSelectedListenerメソッドの呼び出しより前に書いて、setFocusableメソッドの呼び出しを削除して試してください。

投稿2017/07/31 11:09

yona

総合スコア18155

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

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

1129

2017/07/31 12:53 編集

setSelectionメソッドの呼び出しをsetOnItemSelectedListenerメソッドの呼び出しより前に書いて、tagSpinner.setFocusable(false);のみ削除してみましたが、こんどは何のログも残らなくなってしまいました。さらに、if (tagSpinner.isFocusable() == false) {  }の部分も削除してみると,OnResume()時の”ダイアログ作成”ログのみが出力されました。もしもやっている事が間違っていたら教えてください
yona

2017/07/31 13:01

あっていると思います、一応修正したファイルのコードを質問に追記してもらえますか?
1129

2017/08/01 05:41 編集

追記しました。 もしかしたら誤解を生んでいるかもしれないので、望んでいる動作をここに書きます。(質問の文字数の関係) Fabを押す : ダイアログ(inputdialog)の作成と、 ログに「初回起動」 ダイアログのスピナーを押す : 何も起こらない ダイアログのスピナーの【新規作成】を押す : ログに 「ダイアログ作成」  ダイアログをネストさせるつもりだったのですが、分かりにくくなってしまいすいません。 
yona

2017/08/01 06:06

今現在は上記のなにができていないんですか?
1129

2017/08/01 06:12

現在の挙動 Fabを押す : ダイアログ(inputdialog)の作成と、 ログに「ダイアログ作成」 ダイアログのスピナーを押す : 何も起こらない ダイアログのスピナーの【新規作成】を押す : 何も起こらない というような感じになっています。
yona

2017/08/01 06:21 編集

「何も起こらない」とは具体的に何が起きないんですか? onItemSelectedが呼ばれないことを「何も起こらない」と表現しているんですか? そもそもonItemSelectedが呼ばれているか、いないかは確認しましたか? 人に質問するときは曖昧な表現は避けるべきです。
1129

2017/08/01 06:55

 "onItemSelectedが呼ばれないことを「何も起こらない」と表現しているんですか?" はい。曖昧な表現を使ってしまいすいませんでした。  "そもそもonItemSelectedが呼ばれているか、いないかは確認しましたか?" OnItemSelectedブロックの一番初めに if (tagSpinner.isFocusable() == false) { ログ出力 }else{     if(position ==0) {     ログ出力     }else{     ログ出力} } 構文があり、onItemSelectedが呼ばれた場合にはどんな場合でもログが出力されると思っています。 しかし、ダイアログのスピナーの【新規作成】を押した時にはなにもログが出ないのを確認しているので、onItemSelectedは呼ばれていないと思っています。 また、その後 if (tagSpinner.isFocusable() == false) { ブロックに入る前ににログ出力命令を入れてみましたが、ダイアログのスピナーの【新規作成】を押した時には何のログも出ないままでした。
yona

2017/08/01 06:59

setFocusableは消したんですよね?
1129

2017/08/01 07:03 編集

tagSpinnerAdapter.notifyDataSetChanged();の前の行の setFocusable(false); は消しました。 if (tagSpinner.isFocusable() == false) { の中の setFocusable(true); は残してあります。
yona

2017/08/01 10:43

一度コードを簡単にしましょう。 setOnItemSelectedListenerだけ設定するようにして、他のスピナーに対する設定処理をコメントアウトしてください。
1129

2017/08/01 11:35

//tagSpinnerAdapter.notifyDataSetChanged(); //tagSpinner.setFocusable(false); //tagSpinner.setSelection(0,false); を行いました。 Fabを押す : ダイアログ(inputdialog)の作成と、 ログに「ダイアログ作成」( ログに「ダイアログ作成」 は期待されていない) ダイアログのスピナーを押す : ログなし(これで良い) ダイアログのスピナーの【新規作成】を押す : ログなし(ログに「ダイアログ作成」 が期待される) という感じになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問