findViewById()不在非MainActivity类中工作

时间:2012-02-10 13:51:37

标签: android android-view

我的Lyout中有一个文本视图,我想在这个textview中设置一些文本。 这应该在一个不是MainActivity类的类中进行。

问题是我得到了一个空指针异常。

这是我的代码:

public class UserInformations extends Activity{

TextView emailTextView;
LocalDatabase localdatabase= new LocalDatabase(this);


    public void getUserInformation()
    {
    emailTextView = (TextView) findViewById(R.id.EmailTextView);
    String email = localdatabase.getUserEmail();
    emailTextView.setText(email);
    }
}

当我在Main Activity类中执行此操作时,它可以正常工作,但它不适用于其他类。

4 个答案:

答案 0 :(得分:36)

只有findViewById()设置当前的活动布局时,才会在Activity对象上调用setContentView。如果您通过其他方式添加布局,则需要布局的View对象并在其上调用findViewById()

View v = inflater.inflate(id_number_of_layout); # such as R.layout.activity_main
View innerView = v.findViewById(id_number_of_view_inside_v);

如果布局应该是活动的主要布局,那么请执行以下操作:

public class MyActivity extends Activity{
  TextView emailTextView; 

  @Override
  public void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     setContentView(id_number_of_layout);
     emailTextView = (TextView) findViewById(R.id.EmailTextView);
     // ... whatever other set up you need to do ...
  }

  public void getUserInformation() {
     // .... regular code ... 
  }
}

答案 1 :(得分:6)

您尚未设置内容View?


使用这样的东西:

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


    }


}

答案 2 :(得分:5)

findViewById(R.id.EmailTextView);

你要么

  1. 未设置视图布局
  2. 没有带有ID EmailTextView 查看,因此findViewById返回 null 。您不必将类型,而是您在XML中提供给他的ID。
  3. 编辑:根据您的新评论肯定是1。

答案 3 :(得分:4)

时,请致电findViewById。布局必须已经发生。您必须已经设置了内容视图等。

有很多方法可以解决这个问题,如其他答案中所示,但它们与findViewById的工作方式完全不同,只有在您完全了解它们的工作方式时才能用作替代品。大多数情况下,等到初始布局已经发生之后才会更有效率。