1

我正在使用具有不同布局的两个选项卡制作应用程序,这意味着我目前共有三种布局:

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。

谁能给我解释一下?

4

3 回答 3

0

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

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

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

TextView textview = (TextView) YourFragmentTitle.yourFragmentViewTitle.findViewById(R.id.yourId);
于 2013-11-11T23:18:31.063 回答
0

你打电话时:

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

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

要从控制活动访问片段中存在的文本视图,请使用片段管理器(将 id 属性添加到活动 xml 中的片段,或在代码中声明片段时设置标签):

ReceiveFragment receiveFragment = (ReceiveFragment) getSupportFragmentManager().findFragmentById(R.id.receive_fragment);
TextView tv = (TextView) receiveFragment.getView().findViewById(R.id.exchangeRateView);
tv.setText(Double.toString(lastPrice));
于 2013-11-11T23:09:58.773 回答
0

findViewById()从 调用,Activity在 的视图层次结构中查找 id Activity

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

于 2013-11-11T22:41:00.627 回答