Я создал приложение Android с а Spinner
и а TextView
. Я хочу отобразить выбранный элемент из выпадающего списка Spinner в 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
}
}
Ответы:
Так что в первый раз обработайте это с любым значением Integer
Пример: изначально взять
int check = 0;
Вы можете сделать это с логическим значением, а также путем проверки текущих и предыдущих позиций. Посмотреть здесь
источник
Просто поместите эту строку перед установкой OnItemSelectedListener
источник
setSelection(int, boolean)
вызываетsetSelectionInt()
внутри, и вам нужно установить слушателя после (а не до) вызова этого. Остерегайтесь,setSelection(int)
это не сработает, потому что это звонкиsetNextSelectedPositionInt()
внутри, и это то, что привело меня сюда.Начиная с уровня API 3, вы можете использовать onUserInteraction () для Activity с логическим значением, чтобы определить, взаимодействует ли пользователь с устройством.
http://developer.android.com/reference/android/app/Activity.html#onUserInteraction ()
В качестве поля на активность я имею:
Наконец, мой счетчик:
Когда вы приходите и проходите действие, логическое значение сбрасывается в false. Работает как шарм.
источник
Это сработало для меня
Инициализация Spinner в Android проблематична, иногда вышеупомянутая проблема была решена этим шаблоном.
Настройка адаптера должна быть первой частью, а onItemSelectedListener (this) будет последней при инициализации счетчика. По шаблону выше мой OnItemSelected () не вызывается при инициализации счетчика
источник
хаха ... у меня такой же вопрос. Когда initViews () просто делает это. Последовательность - это ключ, слушатель - последний. Удачи !
источник
Мое решение:
источник
Чтобы избежать вызова spinner.setOnItemSelectedListener () во время инициализации
источник
Вы можете сделать это следующим образом:
Сначала я создаю слушателя и приписываю переменную обратного вызова; затем я создаю второго анонимного слушателя, и когда он вызывается в первый раз, это меняет слушателя =]
источник
Затем флаг взаимодействия с пользователем может быть установлен в значение true в методе onTouch и сброшен
onItemSelected()
после обработки изменения выбора. Я предпочитаю это решение, потому что флаг взаимодействия с пользователем обрабатывается исключительно для счетчика, а не для других представлений в действии, которые могут повлиять на желаемое поведение.В коде:
Создайте своего слушателя для спиннера:
Добавьте слушателя к счетчику как an
OnItemSelectedListener
и anOnTouchListener
:источник
Аналогичное простое решение, которое позволяет использовать несколько блесен, состоит в том, чтобы поместить AdapterView в коллекцию - в суперкласс Activity - при первом выполнении onItemSelected (...) Затем проверьте, есть ли AdapterView в коллекции, прежде чем выполнять ее. Это включает один набор методов в суперклассе и поддерживает несколько AdapterViews и, следовательно, несколько счетчиков.
Суперкласс ...
Подкласс ...
}
источник
создать логическое поле
внутри создания деятельности
источник
Попробуй это
источник
Вы можете достичь этого, сначала установив setOnTouchListener, а затем установив onOouch в SetOnItemSelectedListener.
источник
Это сработало для меня:
источник
Основываясь на ответе Абхи, я сделал этого простого слушателя
источник
Была такая же проблема, и это работает для меня:
У меня есть 2 счетчика, и я обновляю их во время init и во время взаимодействия с другими элементами управления или после получения данных с сервера.
Вот мой шаблон:
Когда класс инициирует, используйте setSpinnersListeners () вместо прямой установки слушателя.
Runnable предотвратит запуск счетчика onItemSelected сразу после установки их значений.
Если вам необходимо обновить спиннер (после вызова сервера и т. Д.), Используйте removeSpinnersListeners () непосредственно перед строками обновления и setSpinnersListeners () сразу после строк обновления. Это предотвратит срабатывание onItemSelected после обновления.
источник
Код
источник
Для меня решение Абхи прекрасно работает до уровня API 27.
Но кажется, что начиная с уровня Api 28 и выше onItemSelected () не вызывается, когда слушатель установлен, что означает, что onItemSelected () никогда не вызывается.
Поэтому я добавил короткое выражение if для проверки уровня Api:
Я думаю, что это довольно странно, и я не уверен, что другие тоже имеют эту проблему, но в моем случае это работало хорошо.
источник
Я поместил TextView поверх Spinner, того же размера и фона, что и Spinner, чтобы у меня был больший контроль над тем, как он выглядит, прежде чем пользователь щелкнет по нему. Имея TextView, я также мог бы использовать TextView для отметки, когда пользователь начал взаимодействовать.
Мой код Kotlin выглядит примерно так:
Файл макета выглядит примерно так, и важной частью является то, что Spinner и TextView имеют одинаковую ширину, высоту и поля:
Я уверен, что другие решения работают там, где вы игнорируете первый вызов onItemSelected, но мне действительно не нравится мысль, что он будет вызываться всегда.
источник