【问题标题】:findViewById() not working in a not MainActivity classfindViewById() 在非 MainActivity 类中不起作用
【发布时间】:2016-09-07 10:23:06
【问题描述】:

我的 Lyout 中有一个文本视图,我想在这个文本视图中设置一些文本。 这应该在不是 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 类中执行此操作时,它可以工作,但它在其他类中不起作用。

【问题讨论】:

  • emailTextView = (TextView) findViewById(R.id.EmailTextView);
  • 不,我的数据库在另一个类中。电子邮件值很好,所以我认为问题出在 textView

标签: android android-view


【解决方案1】:

仅当当前 Activity 布局由 setContentView 设置时,对 Activity 对象调用 findViewById() 才有效。如果通过其他方式添加布局,则需要布局的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 ... 
  }
}

【讨论】:

  • 谢谢 DeeV,我在理解这段代码时遇到了一些问题,抱歉。所以,在我的主要活动中,我已经调用了 setcontentview(...) 但现在在我的第二堂课中,我怎样才能找到我的 id_number_of_layout 和 id_number_of_view_inside_v 的 ID 号
  • 你已经知道它们是什么了。在您的情况下,您需要检索包含 ID 为 R.id.EmailTextView 的视图的布局实例。通常,如果您使用 Activity 类之外的另一个类,则必须通过构造函数或 setter 方法传入视图。由于主视图已经在您的主活动类中膨胀,那么您可能希望在该类中调用findViewById(R.id.EmailTextView),然后将文本视图的对象引用传递给您的其他类。
【解决方案2】:

你还没有设置内容视图?


要做到这一点,请使用以下内容:

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


    }


}

【讨论】:

  • 不,怎么做,我是第一次使用内容视图。
  • 您需要在每个活动中包含此内容。
  • 这不能解决问题
  • 那么您是如何定义 EmailTextView 的?您通常会在布局中构建此视图,当您第一次创建项目时,您有一个名为 main.xml 的文件 res > layouts > 这是您放置其他视图的布局,您需要做的是创建一个新布局, 并将这个 emailtextview 放入其中,然后将布局的名称放入 setContentView(R.id.);然后你的问题应该得到解决。发生的事情是您试图获取与您设置的布局无关的视图
【解决方案3】:
findViewById(R.id.EmailTextView);

你也可以

  1. 未设置视图布局
  2. 没有 ID 为 EmailTextViewView,因此 findViewById 返回 null。您不必在 XML 中输入类型,只需输入您给他的 ID。

编辑:绝对是基于您的新 cmets 的 1。

【讨论】:

  • 谢谢,但是如何查看视图布局?
【解决方案4】:

何时您致电findViewById 很重要。布局一定已经发生了。您必须已经设置了内容视图等。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2022-07-26
    • 1970-01-01
    • 2014-11-06
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多