Java 在Android中设置微调器onClickListener()
我试图让onClickListener在微调器上启动,但出现以下错误: Java.lang.RuntimeException是“不要为AdapterView调用setOnClickListener。您可能希望改为setOnItemClickListener,” 我确定我想调用onClickListener,而不是McClickListener。我发现有人问了一个关于堆栈溢出的问题 答案是: 您必须设置“单击” 基础视图上的侦听器 (通常是id为: 旋转器的android.R.id.text1)。到 这样做: 在中创建自定义微调器 构造函数(带属性)创建 通过提供布局来创建微调器 android.R.layout.simple\u微调器\u项目 执行findViewById(android.R.id.text1) 要立即获取文本视图,请设置 onClickListener到TextView 我试过上面提到的答案,但似乎不起作用。在执行findViewById()之后,我得到一个指向TextView的空指针 这就是我正在做的:Java 在Android中设置微调器onClickListener(),java,android,onclick,spinner,Java,Android,Onclick,Spinner,我试图让onClickListener在微调器上启动,但出现以下错误: Java.lang.RuntimeException是“不要为AdapterView调用setOnClickListener。您可能希望改为setOnItemClickListener,” 我确定我想调用onClickListener,而不是McClickListener。我发现有人问了一个关于堆栈溢出的问题 答案是: 您必须设置“单击” 基础视图上的侦听器 (通常是id为: 旋转器的android.R.id.text1)。
Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.layoutspinner,dataArray);
spinner.setAdapter(adapter);
TextView SpinnerText = (TextView)findViewById(R.id.spinnerText);
if (SpinnerText == null) {
System.out.println("Not found");
}
else {
SpinnerText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
//Do something
}
});
}
我已经在API级别7和8上对此进行了测试,得到了相同的结果。以下内容可以按照您的要求工作,但并不理想
public class Tester extends Activity {
String[] vals = { "here", "are", "some", "values" };
Spinner spinner;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
spinner = (Spinner) findViewById(R.id.spin);
ArrayAdapter<String> ad = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, vals);
spinner.setAdapter(ad);
Log.i("", "" + spinner.getChildCount());
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
int a = spinner.getCount();
int b = spinner.getChildCount();
System.out.println("Count =" + a);
System.out.println("ChildCount =" + b);
for (int i = 0; i < b; i++) {
View v = spinner.getChildAt(i);
if (v == null) {
System.out.println("View not found");
} else {
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("","click");
}
});
}
}
}
}, 500);
}
}
公共类测试仪扩展活动{
字符串[]VAL={“here”、“are”、“some”、“value”};
纺纱机;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
微调器=(微调器)findViewById(R.id.spin);
ArrayAdapter ad=新的ArrayAdapter(这是android.R.layout.simple\u下拉列表\u item\u 1line,VAL);
旋转器。设置适配器(ad);
Log.i(“,”+spinner.getChildCount());
定时器t=新定时器();
t、 附表(新TimerTask(){
@凌驾
公开募捐{
int a=spinner.getCount();
int b=spinner.getChildCount();
System.out.println(“Count=“+a”);
System.out.println(“ChildCount=“+b”);
对于(int i=0;i
让我确切地知道您需要微调器如何工作,我们可以制定出更好的解决方案。以下是一个可行的解决方案: 我们将设置OnTouchListener和OnKeyListener,而不是设置微调器的OnClickListener
spinner.setOnTouchListener(Spinner_OnTouch);
spinner.setOnKeyListener(Spinner_OnKey);
听众们:
private View.OnTouchListener Spinner_OnTouch = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
doWhatYouWantHere();
}
return true;
}
};
private static View.OnKeyListener Spinner_OnKey = new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
doWhatYouWantHere();
return true;
} else {
return false;
}
}
};
首先,微调器不支持项目单击事件。调用此方法将引发异常 您可以使用setOnItemSelectedListener:
Spinner s1;
s1 = (Spinner)findViewById(R.id.s1);
int selectionCurrent = s1.getSelectedItemPosition();
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
if (selectionCurrent != position){
// Your code here
}
selectionCurrent= position;
}
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// Your code here
}
});
旋转器s1;
s1=(微调器)findViewById(R.id.s1);
int-selectionCurrent=s1.getSelectedItemPosition();
spinner.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图selectedItemView、整型位置、长id){
如果(选择当前!=位置){
//你的代码在这里
}
选择当前=位置;
}
}
@凌驾
未选择公共无效(AdapterView父视图){
//你的代码在这里
}
});
每当您需要在Android中单击微调器执行某些操作时,请使用以下方法
mspUserState.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
doWhatIsRequired();
}
return false;
}
});
要记住的一件事是在使用上述方法时始终返回False。如果返回True,则单击微调器时不会显示微调器的下拉项。我个人使用:
final Spinner spinner = (Spinner) (view.findViewById(R.id.userList));
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
userSelectedIndex = position;
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
final微调器微调器=(微调器)(view.findviewbyd(R.id.userList));
spinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共无效项(AdapterView父项、视图、整型位置、长id){
userSelectedIndex=位置;
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
我建议将微调器的所有事件分为两种类型:
private void setSelectionWithoutDispatch(Spinner spinner, int position) {
AdapterView.OnItemSelectedListener onItemSelectedListener = spinner.getOnItemSelectedListener();
spinner.setOnItemSelectedListener(null);
spinner.setSelection(position, false);
spinner.setOnItemSelectedListener(onItemSelectedListener);
}
有一个关键时刻:你需要选择(位置,错误)。动画参数中的“false”将立即触发事件。默认行为是将事件推送到事件队列。微调器类实现了
DialogInterface.OnClickListener
,从而有效地劫持了标准的视图。OnClickListener
如果您没有使用子类微调器或不打算使用,请选择其他答案
否则,只需将以下代码添加到自定义微调器:
@Override
/** Override triggered on 'tap' of closed Spinner */
public boolean performClick() {
// [ Do anything you like here ]
return super.performClick();
}
示例:每当打开微调器时,通过Snackbar显示预先提供的提示:
private String sbMsg=null; // Message seen by user when Spinner is opened.
public void setSnackbarMessage(String msg) { sbMsg=msg; }
@Override
/** Override triggered on 'tap' of closed Spinner */
public boolean performClick() {
if (sbMsg!=null && !sbMsg.isEmpty()) { /* issue Snackbar */ }
return super.performClick();
}
自定义微调器是在整个项目中以编程方式标准化微调器外观的极好起点
如果有兴趣,请看我相信我今天尝试了这个,但没有成功,但我会在再试一次后报告。我只是检查了代码,我尝试了,但我仍然得到了一个空引用作为回报。有什么想法吗?编辑了我的问题,还没有完全编辑好,但是谢谢你的帮助,我在这里真的迷路了。我发布的代码的问题是,在执行onCreate之后,微调器在屏幕呈现之前不会实际获取任何项目。如果将循环移动到计时器中
private void setSelectionWithoutDispatch(Spinner spinner, int position) {
AdapterView.OnItemSelectedListener onItemSelectedListener = spinner.getOnItemSelectedListener();
spinner.setOnItemSelectedListener(null);
spinner.setSelection(position, false);
spinner.setOnItemSelectedListener(onItemSelectedListener);
}
@Override
/** Override triggered on 'tap' of closed Spinner */
public boolean performClick() {
// [ Do anything you like here ]
return super.performClick();
}
private String sbMsg=null; // Message seen by user when Spinner is opened.
public void setSnackbarMessage(String msg) { sbMsg=msg; }
@Override
/** Override triggered on 'tap' of closed Spinner */
public boolean performClick() {
if (sbMsg!=null && !sbMsg.isEmpty()) { /* issue Snackbar */ }
return super.performClick();
}