我有两个activity
fragments
。我没有使用<fragment/>
标签,我有两个扩展Fragment
的类,在那个片段中,我有:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.bfragment, container, false); // this will inflate the Fragment in activity.
}
现在的问题是,我正在接收一些活动中的广播接收器,其中一些接收器从第一个片段更新UI,一些接收器从第二个更新UI。
我的主要活动中定义的一个广播接收器是:
private BroadcastReceiver bcReceived = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent intent) {
Log.d("", "BC Object Received");
ActionBar actionbar = getActionBar();
actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab bTab = actionbar.newTab().setText("B");
Fragment fragment = new BFragment();
bTab.setTabListener(new MyTabsListener(fragment));
actionbar.addTab(bTab, true);
final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.bTable); // Getting null pointer exception here. linearLayout is not getting initialized.
我想使用上面的linearLayout并使用它来夸大其中的视图。但是要获得NPE。
这里,当一些广播接收器更新第一个片段时,它可以正常工作,但是当广播接收器从活动中更新第二个片段时,我得到了NPE。
我的问题是:我应该如何以及在何处更新片段?它应该在我的活动中吗?如果是,那么在哪种方法?如果没有那么我应该在哪里更新片段?
请帮帮我!!!
答案 0 :(得分:25)
您的活动逻辑应与片段逻辑分开。
您的活动应该处理如下逻辑:
我需要显示这个片段而不是那个片段
但你的活动不应该处理这种逻辑:
我需要更新片段内的内容
片段的责任是更新它的内容。 另一方面,活动可能告诉片段它需要自我更新。
考虑到这一点,你的片段应该暴露像
这样的方法updateContent(With Blabla)
OR
updateContent()
在您的活动中,当BroadcastReceiver
收到您应该收到的内容时:
updateContent(With Blabla)
方法进行更新。OR
updateContent()
方法更新自己。根据您的应用程序业务逻辑选择最简单的方法。