我正在使用两个具有不同布局的选项卡制作应用程序,这意味着我目前总共有三个布局:
activity_main,fragment_receive,fragment_send
在我的主活动的 onCreate 方法中,以下行将我的内容视图设置为 activity_main。(如果有人能解释为什么这个布局看起来是空白的,但我的应用程序仍然显示两个选项卡,那就太好了。
setContentView(R.layout.activity_main);
然后,我使用 findViewById 方法将文本视图设置为同时显示在fragment_receive.xml和fragment_send.xml中的视图。
currentExchangeRate = (TextView) findViewById(R.id.exchangeRateView);
然后,我尝试在此文本视图上使用 setText 方法。
currentExchangeRate.setText(Double.toString(lastPrice));
这一行给了我 NullPointerException。
谁能向我解释一下?
findViewById()
从Activity
调用,在Activity
视图的层次结构中查找id。
如果要在Fragment
层次结构上执行此操作,则必须在膨胀布局后从Fragment
视图中调用它,例如view.findByById()
从Fragment
onCreateView
调用它。
当您调用时:
currentExchangeRate = (TextView) findViewById(R.id.exchangeRateView);
编译器发现静态 int ID 确实存在于您的 R.id 中,因为您在片段中声明了它们,因此不会引发编译器错误。但在运行时,当前视图布局(使用 setContentView(R.layout.activity_main) 设置的布局;)不保存该 ID,因此返回 null。
要从控制活动访问片段中存在的文本视图,请使用片段管理器(在活动 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));
findViewById
从 活动的布局中检索具有请求 ID 的视图
要获取片段的文本视图,请创建片段onCreateView
返回静态变量的视图,并在onCreateView.
中对其进行初始化
然后,您可以像这样检索文本视图:
TextView textview = (TextView) YourFragmentTitle.yourFragmentViewTitle.findViewById(R.id.yourId);