当前位置: 首页 > 面试题库 >

在Android中设置微调器onClickListener()

微生运浩
2023-03-14
问题内容

我正在尝试使onClickListener在Spinner上触发,但是出现以下错误:

Java.lang.RuntimeException是“不要为AdapterView调用setOnClickListener。您可能需要setOnItemClickListener,”

我确定我要调用onClickListener而不是onItemClickListener。我发现了其他人提出的问题,是否可以将setOnClickListener与AndroidSpinner一起使用?

给出的答案是:

您必须在微调器的基础视图(通常是ID为android.R.id.text1的TextView)上设置Click侦听器。为此:

创建自定义微调器在构造函数(带有属性)中,通过提供布局android.R.layout.simple_spinner_item创建微调器执行findViewById(android.R.id.text1)以获取TextView现在将onClickListener设置为TextView

我已经尝试了此处指出的答案,但似乎没有用。在执行findViewById()之后,我得到了一个指向TextView的空指针。

这就是我在做什么:

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
        }
    });
}

文件layoutspinner.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
                  android:id="@+id/spinnerText"
                  android:singleLine ="true"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:textSize="6pt"
                  android:gravity="right"/>

我究竟做错了什么?

我是新手,我没有找到将其他问题张贴到另一个线程的方法(因为我几乎不需要代表,所以请发表评论),所以我开始了一个新问题。

根据推荐,我尝试了以下方法:

int a = spinnerMes.getCount();
int b = spinnerMes.getChildCount();
System.out.println("Count = " + a);
System.out.println("ChildCount = " + b);
for (int i = 0; i < b; i++) {
    View v = spinnerMes.getChildAt(i);
    if (v == null) {
        System.out.println("View not found");
    }
    else {
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Click code
            }
        });
    }
}

但是LogCat并没有显示出令人满意的结果。

10-14 16:09:08.127: INFO/System.out(3116): Count = 7
10-14 16:09:08.127: INFO/System.out(3116): ChildCount = 0

我已经在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);
    }
}

让我确切地知道您需要微调器如何运行,我们可以找到更好的解决方案



 类似资料:
  • 我有一个微调器,由字符串数组填充。xml,用户将其设置为某物,我将其保存到首选项-我希望在打印字符串时保存字符串,而不是位置。现在,当用户返回时,我想将微调器设置为先前选择的值。 如果我做了 这是可行的,但工作室警告我不要随意选角。有没有正确而漂亮的方法可以做到这一点?或者我必须从字符串资源数组中创建ArrayAdapter并在那里搜索吗?

  • 调试 symbols 让你能更好的调试 sessions. 它们有可执行的动态库的函数信息,并且提供信息来获得干净的调用堆栈. 一个 Symbol 服务器允许调试器自动加载正确的 symbols, 二进制文件 和 资源文件,不用再去强制用户下载巨大的调试文件. 服务器函数类似 Microsoft's symbol server,所以这些文档是可以使用的。 注意,因为公众版本的 Electron 构

  • 调试 symbols 让你能更好的调试 sessions. 它们有可执行的动态库的函数信息,并且提供信息来获得干净的调用堆栈. 一个 Symbol 服务器允许调试器自动加载正确的 symbols, 二进制文件 和 资源文件,不用再去强制用户下载巨大的调试文件. 服务器函数类似 Microsoft's symbol server,所以这些文档是可以使用的。 注意,因为公众版本的 Electron 构

  • 我有一个微调器,里面填充了来自XML的字符串数组: 当用户选择某个内容时,我将其保存到SharedReferences。下次打开应用程序时,如何设置该值?我只保存了值,而没有保存它在微调器列表中的位置 如果我只做旋转单位。适配器要获得适配器,如何安全地投射SpinnerAdapter!到ArrayAdapter?还是这是错误的方法?

  • 我是android开发新手。 我想连接(添加一个字符串到数组列表中的每个项目)并将其设置为我的微调器 我有两个阵列: 数组1= 数组2= 所以我设置只有Array1在这样的旋转: 现在,这是旋转器中显示的内容: 项目1 项目2 项目3 项目4 如何将数组2中的项添加到数组1中的项,以便在微调器中显示类似的内容 项目1、A 项目2,B 项目3,C 项目4,D 对于一个字符串,我可以这样做: 但这是一

  • 调试符号允许您有更好的调试会话sessions 他们有关于可执行文件和动态库中包含的函数的信息,并为您提供获取干净的调用堆栈的信息。 符号服务器允许调试器自动加载正确的符号,二进制文件和源文件,而不强制用户下载大型调试文件。服务器的功能类似Microsoft的符号服务器​ 请注意,因为已发布的Electron版本已大量优化,调试并不总是容易。调试器将无法向您显示所有变量的内容,并且执行路径可能看起