我有Activity
一个Fragment
成员。
在Fragment
我有一些Activity
需要访问的视图对象。因此,Activity
需要知道Fragment
's何时onCreateView
完成。
为了实现这一点,我设置了一个回调以在Fragment
's中触发onActivityCreated
(我知道它被称为 AFTERonViewCreated
并且当视图需要时Activity
,在这种情况下是一个按钮,不会为空)。
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
if (_didLoadCallback != null)
{
_didLoadCallback.callback();
}
}
在我的Activity
我创建片段并设置它的回调:
private void initFragment()
{
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
_fragment = MyFragmentClass.newInstance(new Callbacks.VoidCallback()
{
@Override
public void callback()
{
continueInitializationAfterFragmentLoaded();
}
});
fragmentTransaction.add(_root.getId(), _startWorkoutFragment);
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
}
以及我需要这个钩子的原因,如前所述,Activity
需要访问Fragment
.
在我的Fragment
我有一个我用吸气剂访问的对象:
public Button getButton()
{
return _button;
}
而这个按钮是在onCreateView
.
当我第一次运行程序或重新运行程序时,这非常有效。getButton
但是,当我再次点击即时运行时,程序会因为返回 null而崩溃。
进一步增加我的困惑是我记录了事件以确保我的对象不为空,而且奇怪的是,仅使用即时运行(而不是重新运行),getButton
第一次调用时返回非空(在) 但是当它触发对 的回调时onCreateView
,调用突然返回 null!Fragment
Activity
getButton
D/Log:co.myapp.app.Widgets.Button{84ba583 VE...........I. 0,0-0,0}(片段
onCreateView
)D/Log:null(在 didLoad 回调尝试访问按钮后的活动)
但是,当我重新运行(或完整构建)时,它可以工作:
D/Log:co.myapp.app.Widgets.Button{b0b44a0 VE...........I. 0,0-0,0}(片段
onCreateView
)D/Log:co.myapp.app.Widgets.Button{b0b44a0 VE...........I. 0,0-0,0}(在 didLoad 回调尝试访问按钮后的活动)
你知道发生了什么事吗?或者也许我的初始化回调钩子做错了什么?
更新我什至在触发回调之前验证按钮不为空,它仍然崩溃?!
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
if (_didLoadCallback != null && getButton() != null)
{
_didLoadCallback.callback();
}
}