在activity_main.xml外的TextView上调用setText时出现NullPointerException

时间:2013-11-11 22:32:47

标签: android android-layout

我正在使用两个不同布局的标签创建一个应用程序,这意味着我现在有三个总布局:

activity_main, fragment_receive, fragment_send

在我的主要活动中的onCreate方法中,以下行将我的内容视图设置为activity_main。 (如果有人能解释为什么这个布局看起来是空白的,但我的应用程序仍然显示两个标签,那就太好了。)

setContentView(R.layout.activity_main);

然后我使用findViewById方法将TextView设置为出现在fragment_receive.xml和fragment_send.xml中的视图。

currentExchangeRate = (TextView) findViewById(R.id.exchangeRateView);

然后我尝试在此TextView上使用setText方法。

currentExchangeRate.setText(Double.toString(lastPrice));

这一行给了我NullPointerException。

任何人都可以向我解释这个吗?

3 个答案:

答案 0 :(得分:0)

来自findViewById()

Activity,在Activity的观看次序层次中查找ID。

如果要在Fragment层次结构上执行此操作,则必须从Fragment视图中调用它,例如view.findByById() Fragment onCreateView膨胀布局后。

答案 1 :(得分:0)

致电时:

currentExchangeRate = (TextView) findViewById(R.id.exchangeRateView);

编译器发现静态int ID确实存在于您的R.id中,因为您在片段中声明了它们,因此不会抛出编译器错误。但是在运行时,当前视图布局(使用setContentView(R.layout.activity_main)设置的布局;)不保存该ID,因此返回null。

要从Controlling Activity访问Fragment中存在的textview,可以使用Fragment Manager(在activity xml中为片段添加id属性,或在代码中声明片段时设置标记):

ReceiveFragment receiveFragment = (ReceiveFragment) getSupportFragmentManager().findFragmentById(R.id.receive_fragment);
TextView tv = (TextView) receiveFragment.getView().findViewById(R.id.exchangeRateView);
tv.setText(Double.toString(lastPrice));

答案 2 :(得分:0)

findViewById从您的活动布局中检索具有请求ID 的视图

要获取片段的文本视图,请创建片段onCreateView返回静态变量并在onCreateView.

中初始化它的视图

然后你可以像这样检索文本视图:

TextView textview = (TextView) YourFragmentTitle.yourFragmentViewTitle.findViewById(R.id.yourId);