195

と を使用して Android アプリケーションを作成しましSpinnerTextView。スピナーのドロップダウン リストから選択したアイテムを TextView に表示したいと考えています。メソッドに Spinner を実装したonCreateので、プログラムを実行すると、TextView(ドロップダウン リストから項目を選択する前に) に値が表示されます。

ドロップダウン リストから項目を選択した後にのみ、TextView に値を表示したいと考えています。どうすればいいですか?

これが私のコードです:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class GPACal01Activity extends Activity implements OnItemSelectedListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Spinner spinner = (Spinner) findViewById(R.id.noOfSubjects);

        // Create an ArrayAdapter using the string array and a default spinner layout
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.noofsubjects_array, android.R.layout.simple_spinner_item);
        // Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Apply the adapter to the spinner
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);
    }

    public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) {
        TextView textView = (TextView) findViewById(R.id.textView1);
        String str = (String) parent.getItemAtPosition(pos);
        textView.setText(str);
    }

    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }
}
4

20 に答える 20

202
spinner.setOnItemSelectedListener(this); // Will call onItemSelected() Listener.

したがって、初めてこれを任意の整数値で処理します

例:最初に取るint check = 0;

public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) {
   if(++check > 1) {
      TextView textView = (TextView) findViewById(R.id.textView1);
      String str = (String) parent.getItemAtPosition(pos);
      textView.setText(str);
   }
}

ブール値を使用して、現在および以前の位置を確認することによっても実行できます。こちらをご覧ください

于 2012-11-15T13:02:21.480 に答える
168

設定するにこの行を入れるだけですOnItemSelectedListener

spinner.setSelection(0,false)

これが機能するのは、リスナーが追加されたときに項目が既に選択されているように内部的にsetSelection(int, boolean)呼び出すためです。setSelectionInt()

内部setSelection(int)で呼び出すため、動作しないことに注意してください。setNextSelectedPositionInt()

于 2016-06-01T06:58:35.143 に答える
67

API レベル 3 以降では、アクティビティで onUserInteraction() をブール値とともに使用して、ユーザーがデバイスと対話しているかどうかを判断できます。

http://developer.android.com/reference/android/app/Activity.html#onUserInteraction()

@Override
public void onUserInteraction() {
     super.onUserInteraction();
     userIsInteracting = true;
}

私が持っているアクティビティのフィールドとして:

 private boolean userIsInteracting;

最後に、私のスピナー:

      mSpinnerView.setOnItemSelectedListener(new OnItemSelectedListener() {

           @Override
           public void onItemSelected(AdapterView<?> arg0, View view, int position, long arg3) {
                spinnerAdapter.setmPreviousSelectedIndex(position);
                if (userIsInteracting) {
                     updateGUI();
                }
           }

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

           }
      });

アクティビティを行ったり来たりすると、ブール値は false にリセットされます。魅力のように機能します。

于 2014-07-31T23:42:09.643 に答える
3

複数のスピナーを有効にする同様の簡単な解決策は、onItemSelected(...) の最初の実行時に AdapterView をコレクション (アクティビティ スーパークラス) に配置することです。これにより、スーパークラスで 1 セットのメソッドが有効になり、複数の AdapterView がサポートされるため、複数のスピナーがサポートされます。

スーパークラス...

private Collection<AdapterView> AdapterViewCollection = new ArrayList<AdapterView>();

   protected boolean firstTimeThrough(AdapterView parent) {
    boolean firstTimeThrough = ! AdapterViewCollection.contains(parent);
    if (firstTimeThrough) {
       AdapterViewCollection.add(parent);
     }
    return firstTimeThrough;
   }

サブクラス ...

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
      if (! firstTimeThrough(parent)) {
        String value = safeString(parent.getItemAtPosition(pos).toString());
        String extraMessage = EXTRA_MESSAGE;
        Intent sharedPreferencesDisplayIntent = new         Intent(SharedPreferencesSelectionActivity.this,SharedPreferencesDisplayActivity.class);
    sharedPreferencesDisplayIntent.putExtra(extraMessage,value);
    startActivity(sharedPreferencesDisplayIntent);
  }
  // don't execute the above code if its the first time through
  // do to onItemSelected being called during view initialization.

}

于 2013-07-18T16:26:00.313 に答える
3

次に、onTouch メソッドでユーザー操作フラグを true に設定しonItemSelected()、選択の変更が処理されるとリセットできます。ユーザー操作フラグはスピナー専用に処理され、目的の動作に影響を与える可能性のあるアクティビティ内の他のビューでは処理されないため、私はこのソリューションを好みます。

コード内:

スピナーのリスナーを作成します。

public class SpinnerInteractionListener implements AdapterView.OnItemSelectedListener, View.OnTouchListener {

    boolean userSelect = false;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        userSelect = true;
        return false;
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
        if (userSelect) { 
            userSelect = false;
            // Your selection handling code here
        }
    }

}

リスナーを と の両方としてスピナーに追加しOnItemSelectedListenerますOnTouchListener

SpinnerInteractionListener listener = new SpinnerInteractionListener();
mSpinnerView.setOnTouchListener(listener);
mSpinnerView.setOnItemSelectedListener(listener);
于 2017-03-07T03:39:59.227 に答える
1

最初に setOnTouchListener を設定し、次に onTouch で setOnItemSelectedListener を設定することで実現できます。

@Override
public boolean onTouch(final View view, final MotionEvent event) {
 view.setOnItemSelectedListener(this)
 return false;
}
于 2015-11-19T08:06:11.520 に答える
0

同じ問題があり、これは私にとってはうまくいきます:

私は 2 つのスピナーを持っており、初期化中、他のコントロールとの対話中、またはサーバーからデータを取得した後にそれらを更新します。

ここに私のテンプレートがあります:

public class MyClass extends <Activity/Fragment/Whatever> implements Spinner.OnItemSelectedListener {

    private void removeSpinnersListeners() {
        spn1.setOnItemSelectedListener(null);
        spn2.setOnItemSelectedListener(null);
    }

    private void setSpinnersListeners() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                spn1.setOnItemSelectedListener(MyClass.this);
                spn2.setOnItemSelectedListener(MyClass.this);
            }
        }, 1);
    }

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

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

クラスが開始するときは、リスナーを直接設定する代わりにsetSpinnersListeners()を使用します。

Runnable は、値を設定した直後にスピナーが onItemSelected を起動するのを防ぎます。

スピナーを更新する必要がある場合 (サーバー呼び出しなどの後) は、更新行の直前でremoveSpinnersListeners()を使用し、更新行の直後でsetSpinnersListeners () を使用します。これにより、更新後に onItemSelected が起動されなくなります。

于 2015-10-22T15:04:33.890 に答える