Re: [Android-SDK-Japan:2394] spinner1に連動して変化するspinner2の初期値設定

1,873 views
Skip to first unread message

egg

unread,
Sep 12, 2012, 4:26:50 AM9/12/12
to android-...@googlegroups.com
poleさん

> final static int INDEX_SPINNER1_FISH = 0;
> final static int INDEX_SPINNER1_MEAT = 1;

逆ではないでしょうか。(肉が0で魚が1)


------------------------------------------
EGAWA Takashi


2012年9月12日 14:52 pole <lap...@gmail.com>:
> spinner1に「魚」「肉」という項目を設定し
> 「魚」が選択されたらspinner2に「魚_0」or「魚_1」を表示する
> 「肉」が選択されたらspinner2に「肉_0」or「肉_1」を表示する
> という動作をする画面を作ろうとしているのですが初期値の設定がうまく出来ません。
>
> 下記コードのようにonCreate()内でspinner1に「肉」を設定後spinner2に「肉_1」を設定しているのですが
> onCreate()を抜けた後にspinner1のonItemSelected()が呼ばれて「肉」「肉_0」が設定されてしまっているような感じです。
> 初期値の設定をonStart()やonResume()に移動して試してみましたが同様にダメでした。
>
> このような場合、どのようにすれば良いのかご存知のかたはいらっしゃいますでしょうか
>
>
> public class MainActivity extends Activity {
> final static int INDEX_SPINNER1_FISH = 0;
> final static int INDEX_SPINNER1_MEAT = 1;
> final static int INDEX_SPINNER2_FISH_0 = 0;
> final static int INDEX_SPINNER2_FISH_1 = 1;
> final static int INDEX_SPINNER2_MEAT_0 = 0;
> final static int INDEX_SPINNER2_MEAT_1 = 1;
>
> @Override public void onCreate(Bundle savedInstanceState) {
> super.onCreate(savedInstanceState);
> setContentView(R.layout.main);
>
> SetSpinner1(0);
>
> // 初期値の設定
> ((Spinner)findViewById(R.id.spinner1)).setSelection(INDEX_SPINNER1_MEAT);
>
> ((Spinner)findViewById(R.id.spinner2)).setSelection(INDEX_SPINNER2_MEAT_1);
> }
>
> void SetSpinner1(int position1) {
> String[] strings = getResources().getStringArray(R.array.spinner1_array);
> ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
> android.R.layout.simple_spinner_item, strings);
>
> adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
> Spinner spinner1 = (Spinner)findViewById(R.id.spinner1);
> spinner1.setAdapter(adapter);
> spinner1.setSelection(position1);
> spinner1.setOnItemSelectedListener(new
> AdapterView.OnItemSelectedListener() {
> @Override public void onItemSelected(AdapterView<?> parent, View view,
> int position, long id) {
> SetSpinner2(position, 0);
> }
> @Override public void onNothingSelected(AdapterView<?> arg0) {
> }
> });
>
> SetSpinner2(position1, 0);
> }
>
> void SetSpinner2(int position1, int position2) {
> String[] strings;
> if (position1 == INDEX_SPINNER1_MEAT) {
> strings = getResources().getStringArray(R.array.spinner2_meat_array);
> } else {
> strings = getResources().getStringArray(R.array.spinner2_fish_array);
> }
> ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
> android.R.layout.simple_spinner_item, strings);
>
> adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
> Spinner spinner2 = (Spinner)findViewById(R.id.spinner2);
> spinner2.setAdapter(adapter);
> spinner2.setSelection(position2);
> spinner2.setOnItemSelectedListener(new
> AdapterView.OnItemSelectedListener() {
> @Override public void onItemSelected(AdapterView<?> parent, View view,
> int position, long id) {
> }
> @Override public void onNothingSelected(AdapterView<?> arg0) {
> }
> });
> }
> }
>
> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-sdk-japan/-/2QwtEbcH_o0J
> にアクセスしてください。
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja
> からこのグループにアクセスしてください。

Tetsuro Nakamura

unread,
Sep 12, 2012, 10:54:51 AM9/12/12
to android-...@googlegroups.com

t2lowと申します。

ご自身で仰られているように以下が原因かと思います。

> spinner1の onItemSelected()が呼ばれて

onItemSelected()が呼ばれて困るのであれば、setOnItemSelectedListener()を呼ぶ前にスピナを初期化するようにすれば回避できると思います。

2012/09/12 17:27 "egg" <t.e...@gmail.com>:

pole

unread,
Sep 12, 2012, 10:54:11 PM9/12/12
to android-...@googlegroups.com

>eqqさん
コードを見直しましたが数値が間違っているということななさそうです。

>t2lowさん
下記コードのようにadapterの設定とsetOnItemSelectedListenerの設定を分離し
adapter設定 → selection設定 → setOnItemSelectedListener設定の流れで動作させてみましたが
やはりonCreate()終了後にonItemSelected()が呼ばれてしまいました。

■■ ここからLog.dのログ ■■
onCreate() : start
spinner1SetAdapter()
spinner1SetSelection() : 肉
spinner2SetAdapter() : 肉
spinner2SetSelection() : 肉_1
spinner1SetOnItemSelectedListener()
spinner2SetOnItemSelectedListener()
onCreate() : end
onStart()
onResume()
spinner1 : onItemSelected() : 肉
spinner2SetAdapter() : 肉
spinner2SetSelection() : 肉_0
spinner2 : onItemSelected() : 肉_0
spinner2 : onItemSelected() : 肉_0

■■ ここからコード ■■


public class MainActivity extends Activity {
 final static int INDEX_SPINNER1_FISH = 0;
 final static int INDEX_SPINNER1_MEAT = 1;
 final static int INDEX_SPINNER2_FISH_0 = 0;
 final static int INDEX_SPINNER2_FISH_1 = 1;
 final static int INDEX_SPINNER2_MEAT_0 = 0;
 final static int INDEX_SPINNER2_MEAT_1 = 1;

 final static String[] spinner1_array = {"魚", "肉"};
 final static String[] spinner2_fish_array = {"魚_0", "魚_1"};
 final static String[] spinner2_meat_array = {"肉_0", "肉_1"};

 final static String TAG_LogD = "DebugMessage";

 @Override public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  Log.d(TAG_LogD, "★★★★★★★★★★★★★★★★\nonCreate() : start");

  int position1 = INDEX_SPINNER1_MEAT;
  int position2 = INDEX_SPINNER2_MEAT_1;

  spinner1SetAdapter();
  spinner1SetSelection(position1);

  spinner2SetAdapter(position1);
  spinner2SetSelection(position2);

  spinner1SetOnItemSelectedListener();
  spinner2SetOnItemSelectedListener();

  Log.d(TAG_LogD, "onCreate() : end");
 }

 void spinner1SetAdapter() {
  Log.d(TAG_LogD, "spinner1SetAdapter()");
  String[] strings = spinner1_array;


  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, strings);
  adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

  ((Spinner)findViewById(R.id.spinner1)).setAdapter(adapter);
 }

 void spinner1SetSelection(int position1) {
  Log.d(TAG_LogD, "spinner1SetSelection() : " + spinner1_array[position1]);
  ((Spinner)findViewById(R.id.spinner1)).setSelection(position1);
 }

 void spinner1SetOnItemSelectedListener() {
  Log.d(TAG_LogD, "spinner1SetOnItemSelectedListener()");
  ((Spinner)findViewById(R.id.spinner1)).setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {


   @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

    Log.d(TAG_LogD, "spinner1 : onItemSelected() : " + parent.getSelectedItem());
    spinner2SetAdapter(position);
    spinner2SetSelection(0);


   }
   @Override public void onNothingSelected(AdapterView<?> arg0) {
   }
  });
 }

 void spinner2SetAdapter(int position1) {
  Log.d(TAG_LogD, "spinner2SetAdapter() : " + spinner1_array[position1]);
  String[] strings = (position1 == INDEX_SPINNER1_MEAT) ? spinner2_meat_array : spinner2_fish_array;


  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, strings);
  adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

  ((Spinner)findViewById(R.id.spinner2)).setAdapter(adapter);
 }

 void spinner2SetSelection(int position2) {
  Log.d(TAG_LogD, "spinner2SetSelection() : " + ((Spinner)findViewById(R.id.spinner2)).getAdapter().getItem(position2).toString());
  ((Spinner)findViewById(R.id.spinner2)).setSelection(position2);
 }

 void spinner2SetOnItemSelectedListener() {
  Log.d(TAG_LogD, "spinner2SetOnItemSelectedListener()");
  ((Spinner)findViewById(R.id.spinner2)).setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {


   @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

    Log.d(TAG_LogD, "spinner2 : onItemSelected() : " + parent.getSelectedItem());


   }
   @Override public void onNothingSelected(AdapterView<?> arg0) {
   }
  });
 }

 @Override protected void onStart() {
  super.onStart();
  Log.d(TAG_LogD, "onStart()");
 }

 @Override protected void onResume() {
  super.onResume();
  Log.d(TAG_LogD, "onResume()");
 }
}

E.D.A中條

unread,
Sep 13, 2012, 12:00:34 AM9/13/12
to android-...@googlegroups.com
poleさん

jyoと申します。

>やはりonCreate()終了後にonItemSelected()が呼ばれてしまいました。
調べてみたのですが、
setSelection()で選択をしたから、画面作成後(onResume()の後)にonItemSelected()を呼ぶ」
と言う仕様みたいです。

回避方法は、初回時のみ処理をしないと言う作りにすれば問題は無いかと思います。
(例えばメンバに"初回時フラグ"を持たせて、onResume()のタイミングでtrueにし、
onItemSelected()内部で"初回時フラグ"がtrueならfalseにし、returnをする)

参考になれば幸いと思います。

2012年9月13日 11:54 pole <lap...@gmail.com>:

--
このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-sdk-japan/-/QRKuJDCqyJIJ にアクセスしてください。

egg

unread,
Sep 13, 2012, 12:05:47 AM9/13/12
to android-...@googlegroups.com
poleさん

ボケてました。スミマセン。確かにおきますね。

1. UIキューの後ろに回す。

findViewById(R.id.spinner1).post(new Runnable() {
@Override
public void run() {
spinner1SetOnItemSelectedListener();
spinner2SetOnItemSelectedListener();
}
});

2. フラグを持たせる

boolean initialized = false;

spinner1のsetOnItemSelectedListenerで
if(initialized) {
spinner2SetSelection(0);
} else {
// 初期値を設定
spinner2SetSelection(1);
initialized = true;
}

などで回避できると思います。

------------------------------------------
EGAWA Takashi


2012年9月13日 11:54 pole <lap...@gmail.com>:

pole

unread,
Sep 13, 2012, 1:38:49 AM9/13/12
to android-...@googlegroups.com
>jyoさん
>eggさん
 
Runnableという関数を使ったことがなかったので(というか見たことすらなかったです)
こちらで試したところ、期待通りの動作をするようになりました。
フラグで処理するよりもソースコードがすっきりしていますし
こちらの方法で実装を進めようと思います。
 
お忙しい中お付き合いくださいまして、本当にありがとうございました。
Reply all
Reply to author
Forward
0 new messages