8

私は Android アプリケーションでスピナー コントロールを使用しており、onItemSelectedListener()メソッドを介してユーザーの選択を処理しています。これは、現在の選択とは異なる選択が行われたときに問題なく動作するようです。特定の条件下で、すべてのスピナーをデフォルト値にリセットし、すべてに対してonItemSelectedListener()呼び出されるようにしたいと思います。

onItemSelectedListener()ユーザーの選択が変更されたときにのみ呼び出されるのは、Android のセマンティクスの一部ですか。強制的onItemSelectedListener()に呼び出される方法はありますか?

4

3 に答える 3

12

スピナーの「onItemSelected」を発動させたい場合は、スピナー内のアイテムが選択されている場合 / アイテムが選択されていて、再度クリックされた場合 . 次に、スピナーを拡張するこのカスタムクラスを使用します。これは私にとってはうまくいきました

次に、このようなスピナーでアクティビティを編集します。変更しました

  static Spinner spinner1;

  static NDSpinner spinner1;

   variables.spinner1 = (Spinner) findViewById(R.id.spinner1); 

   variables.spinner1 = (NDSpinner ) findViewById(R.id.spinner1); 

また、スピナーが配置されているxmlレイアウトを変更しました

    <Spinner
    android:id="@+id/spinner1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/place" />

    <com.yourpackagename.NDSpinner 
     android:id="@+id/spinner1"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:text="@string/place" />

スピナー拡張クラス:

 package com.yourpackagename;
 import android.content.Context;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.widget.Spinner;
 import android.widget.Toast;
 import java.lang.reflect.Field;

     /** Spinner extension that calls onItemSelected even when the selection is the same as       its previous value. 
       *   ie This is extended "Customized class of Spinner" to  get the "onItemSelected"      event even if the item in the
     *  Spinner is already  selected by the user*/
    public class NDSpinner extends Spinner {

      public NDSpinner(Context context)
      { super(context); }

      public NDSpinner(Context context, AttributeSet attrs)
      { super(context, attrs); }

      public NDSpinner(Context context, AttributeSet attrs, int defStyle)
      { super(context, attrs, defStyle); }


      private void ignoreOldSelectionByReflection() {
            try {
                Class<?> c = this.getClass().getSuperclass().getSuperclass().getSuperclass();
                Field reqField = c.getDeclaredField("mOldSelectedPosition");
                reqField.setAccessible(true);
                reqField.setInt(this, -1);
            } catch (Exception e) {
                Log.d("Exception Private", "ex", e);
                // TODO: handle exception
            }
        }

      @Override
      public void  setSelection(int position, boolean animate)
      {
        boolean sameSelected = position == getSelectedItemPosition();
        ignoreOldSelectionByReflection();
        super.setSelection(position, animate);
        if (sameSelected) {
          // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
          getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());


        }
      }
      @Override
      public void setSelection(int position) {
          ignoreOldSelectionByReflection();
          super.setSelection(position);
      }

    }
于 2013-09-09T07:54:41.717 に答える
3

現在選択されているアイテムと同じアイテムを選択した場合、デフォルトのスピナーはイベントをトリガーしません。これを行うには、カスタムスピナーを作成する必要があります。現在選択されているアイテムが再度選択されたときにAndroidSpinnerでイベントを取得するにはどうすればよいですか?を参照してください。

于 2012-11-01T21:45:48.223 に答える