如何在所选项目更改时为Spinner设置事件侦听器?
基本上我想要做的是类似于这样的事情:
spinner1.onSelectionChange = handleSelectionChange;
void handleSelectionChange(Object sender){
//handle event
}
Run Code Online (Sandbox Code Playgroud) 我用a Spinner
和a 创建了Android应用程序TextView
.我的任务是在TextView的Spinner下拉列表中显示所选项目.我在onCreate
方法中实现了Spinner,所以当我运行程序时,它会显示一个值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 …
Run Code Online (Sandbox Code Playgroud) 有没有人知道如何在实例化布局时阻止onItemSelected()(OnItemSelectedListener接口)方法运行?我需要知道是否有办法做到这一点,因为我想保持我如何实例化我的布局与该侦听器分开.
我已经尝试在重写方法内部的所有代码周围创建一个最初设置为false的if语句,但是无法知道何时将其设置为true,因为重写的方法在onCreate(),onStart()之后运行,并且每次onResume()方法.
我没有找到任何明确的答案.任何明确的解决方案将不胜感激.
当我创建我的活动时,我设置了一个Spinner,为它分配一个监听器和一个初始值.我知道onItemSelected
在应用程序初始化期间会自动调用回调.我觉得很奇怪的是,当设备旋转时会发生两次这种情况,这会导致我遇到一些问题,我不得不绕过它.如果微调器初始选择为零,则不会发生这种情况.我能够隔离问题,这是触发它的最简单的活动:
public class MainActivity extends Activity implements OnItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("Test","Activity onCreate");
setContentView(R.layout.activity_main);
((Spinner)findViewById(R.id.spinner1)).setSelection(2);
((Spinner)findViewById(R.id.spinner1)).setOnItemSelectedListener(this);
}
@Override
public void onItemSelected(AdapterView<?> spin, View selview, int pos, long selId)
{
Log.i("Test","spin:"+spin+" sel:"+selview+" pos:"+pos+" selId:"+selId);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {}
}
Run Code Online (Sandbox Code Playgroud)
这是启动应用程序然后旋转设备时显示的logcat:
I/Test( 9881): spin:android.widget.Spinner@4052f508 sel:android.widget.TextView@40530b08 pos:2 selId:2
I/Test( 9881): Activity onCreate
I/Test( 9881): spin:android.widget.Spinner@40535d80 sel:android.widget.TextView@40538758 pos:2 selId:2
I/Test( 9881): spin:android.widget.Spinner@40535d80 sel:android.widget.TextView@40538758 pos:2 selId:2
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?我错过了什么吗?
我有一个微调器,我在对话框视图中显示,并且onItemSelected
调用对话框开始的那一刻.我真的不想处理这个,但只有当用户做出选择时.所以我要么阻止这种情况(可能是因为没有设置默认值?),或者我需要知道进行此选择的用户不是?
当以编程方式更改微调器选择时,以及当用户物理单击微调器控件时,都会调用OnItemSelectedListener事件处理程序.是否可以确定某个事件是否由用户选择以某种方式触发?
或者是否有另一种方法来处理微调器用户选择?
我有36个微调器,我用一些值初始化了.我用过onItemSelectedListener.像往常一样,用户可以与这些微调器交互,触发onItemSeected函数.
一个问题是调用是在init期间进行的,但我在这里找到了它的解决方案并避免使用全局变量"count"并在onItemSelected中执行代码之前检查count> 36.
我的问题是:用户可以选择单击名为"Previous"的按钮,我必须重置一些微调器值.
我尝试在重置微调器之前将count的值更改为0,然后在重置后将其更改回37,但我已经明白只有在每个其他函数执行完毕后才调用onItemSelected,所以它被称为AFTER count即使微调器值在用户选择后立即设置,也会更改回37.
我需要重复刷新一些微调器而不触发onItemSelected函数.有谁能帮我找到解决方案?谢谢.
我创建了一个微调器,当一个人使用阵列适配器添加设备时,该微调器会自动更新设备名称.我使用微调器创建了一个OnItemSelected方法,因此当选择微调器中的一个名称时,会出现一个新窗口.但是,OnItemSelected会在活动开始时自动选择列表中的第一个项目,因此用户在新窗口出现之前无法实际进行选择.
这是代码:
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
startActivity(new Intent("com.lukeorpin.theappliancekeeper.APPLIANCESELECTED"));
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
Run Code Online (Sandbox Code Playgroud)
有没有人知道列表中的第一项不会自动选择的方式?
以下是其余微调器的代码:
ArrayAdapter<String> appliancenameadapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, ApplianceNames); //Sets up an array adapter containing the values of the ApplianceNames string array
applianceName = (Spinner) findViewById(R.id.spinner_name); //Gives the spinner in the xml layout a variable name
applianceName.setAdapter(appliancenameadapter); //Adds the contents of the array adapter into the spinner
applianceName.setOnItemSelectedListener(this);
Run Code Online (Sandbox Code Playgroud) Spinner OnclickListener事件执行两次 -
监听器的实现方式如下:
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
Run Code Online (Sandbox Code Playgroud)
问题定义
我想将用户选择的文本保存到数据存储中,当用户从微调器中选择任何项目时,我能够执行此操作.但我的另一项任务是将以前选择的项目(从数据存储中访问)显示为微调器中的选定项目,但每次调用微调器的活动时,微调器都会将第一项显示为默认选定项目,并且在数据存储中也会更改之前的项目项目为默认值.
如何区分"Spinner初始化"和"用户手动选择"事件?