Android findViewById在主Activity以外的类中使用时返回null

时间:2011-03-07 16:36:19

标签: android

我想在我的侦听器类中通过ID获取TextView,它处理一个微调器的onItemSelected事件。在我的主Activity中,我可以调用findViewById(R.id.textView1),它工作正常。但是如果我在我的spinner监听器类中调用相同的函数,它总是返回null并强制关闭应用程序。

任何人都知道为什么findViewById在我的主Activity中工作但在我的监听器类中不起作用?

以下是我主要活动的代码。单击按钮时会调用它:

public void something ()
{
    setContentView(R.layout.spinnerLayout);

    Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            this, R.array.spinner_array, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());

}

以下是MyOnItemSelectedListener的代码:

public class MyOnItemSelectedListener implements OnItemSelectedListener 
{

    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) 
    {               
        TextView tv = view.findViewById(R.id.myTextView);
        // I want to set the text of this text view to the value selected using the spinner
        tv.setText("Something");
    }

    public void onNothingSelected(AdapterView parent) {
      // Do nothing.
    }
}

我需要做什么才能获得“TextView tv = view.findViewById(R.id.myTextView);”工作?

感谢!!!

5 个答案:

答案 0 :(得分:7)

为了findViewById能够正常工作,您必须先前调用setContentView

答案 1 :(得分:1)

您在哪里设置内容视图?当您展开Activity时,应该有一个方法onCreate,您需要setContentView(R.id.textview1)

答案 2 :(得分:1)

如果您有其他帖子中提到的setContentView,则可能需要指定查看textview的视图:

TextView tv = (TextView)view.findViewById (R.id.textView1);

答案 3 :(得分:0)

  

在我的主Activity中,我可以调用findViewById(R.id.textView1),它工作正常。但是如果我在我的spinner监听器类中调用相同的函数,它总是返回null并强制关闭应用程序。

由于我也是Android的新手,我可能错了,但我有一些我正在考虑的事情:

  1. 为什么你的听众会延长活动?
  2. 如果你再次调用findByView,android必须再次沿着树向下找到正确的ID,只要在字段变量中找到它就保存textView
  3. 如果那真的是一个活动,你是否在主活动中启动了正确的Intent来启动它?
  4. 你是否将该活动添加到manifest.xml?
  5. ......正如其他人已经说过的那样,这可能是错误的背景。
  6. 更多代码片段会很好。 nyyrikki

答案 4 :(得分:0)

这是一个如此古老的未回答问题,但它与我刚刚使用 getRootView() 解决的问题最接近。问题是 view 内的 OnItemSelectedListener 指的是微调器内显示的文本的 View 对象。 由于 findViewById 会查找 descendants of the current view,因此它不会找到您要查找的文本视图。

更换

        TextView tv = view.findViewById(R.id.myTextView);
        // I want to set the text of this text view to the value selected using the spinner
        tv.setText("Something");

        TextView tv = view.getRootView().findViewById(R.id.myTextView);
        // I want to set the text of this text view to the value selected using the spinner
        tv.setText("Something");

会使 findViewById 从根目录搜索您的文本视图,这可能是您期望发生的事情。