Android 即时运行每次都会崩溃,除非调用重新运行(onActivityCreated回调问题)
我有一个Android 即时运行每次都会崩溃,除非调用重新运行(onActivityCreated回调问题),android,android-fragments,android-studio,android-lifecycle,android-instant-run,Android,Android Fragments,Android Studio,Android Lifecycle,Android Instant Run,我有一个活动,它有一个片段成员 在片段中我有一些活动需要访问的视图对象。因此,活动需要知道片段的onCreate视图何时完成 为了实现这一点,我设置了一个回调,在片段的onActivityCreated(我知道它在onViewCreated之后调用,当Activity想要查看时,在这种情况下,按钮将不会为null) 在我的活动中创建片段并设置其回调: private void initFragment() { FragmentManager fragmentManager = getFr
活动
,它有一个片段
成员
在片段中
我有一些活动
需要访问的视图对象。因此,活动
需要知道片段
的onCreate视图
何时完成
为了实现这一点,我设置了一个回调,在片段的onActivityCreated
(我知道它在onViewCreated
之后调用,当Activity
想要查看时,在这种情况下,按钮将不会为null)
在我的活动中
创建片段并设置其回调:
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();
}
我之所以需要这个钩子,正如前面提到的,活动
需要访问片段
中的对象
在我的片段中
有一个对象,我用getter访问它:
public Button getButton()
{
return _button;
}
这个按钮是在onCreateView
中创建的
当我第一次运行该程序或从重新运行时,它工作得非常好。但是,当我再次点击instant run时,程序崩溃,因为getButton
返回空值
更让我困惑的是,我记录这些事件是为了确保我的对象不是空的,奇怪的是,只有即时运行(而不是重新运行),getButton
在第一次调用时返回一个NOTNULL(在片段中的onCreateView
)但是当它启动对活动的回调时,getButton
调用突然返回null
D/Log:co.myapp.app.Widgets.Button{84ba583 V.E………I.0,0-0,0}(FragmentonCreateView
)
D/Log:null
(didLoad回调尝试访问按钮后的活动)
但是,当我重新运行(或完整构建)时,它仍然有效:
D/Log:co.myapp.app.Widgets.Button{b0b44a0 V.E………I.0,0-0,0}
(片段onCreateView
)
D/Log:co.myapp.app.Widgets.Button{b0b44a0 V.E………I.0,0-0,0}
(didLoad回调尝试访问按钮后的活动)
你知道发生了什么事吗?或者我的初始化回调钩子做错了什么
更新我甚至在启动回调之前验证按钮是否为空,但它仍然崩溃
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
if (_didLoadCallback != null && getButton() != null)
{
_didLoadCallback.callback();
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
if (_didLoadCallback != null && getButton() != null)
{
_didLoadCallback.callback();
}
}