私はメンバーActivity
を持つを持っています。Fragment
には、アクセスFragment
する必要があるいくつかのビュー オブジェクトがありActivity
ます。そのため、はがいつ終了Activity
したかを知る必要があります。Fragment
onCreateView
これを達成するために、 で起動するコールバックを設定しました(これは AFTER と呼ばれ、必要Fragment
なビュー(この場合はボタン) が null にならないことがわかっています)。onActivityCreated
onViewCreated
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 が返されるため、プログラムがクラッシュします。
さらに混乱を招くのは、オブジェクトが null でないことを確認するためにイベントをログに記録したことです。奇妙なことに、(再実行ではなく) インスタント実行のみでgetButton
、最初に呼び出されたときに null 以外を返します (の中onCreateView
でFragment
)が、へのコールバックを起動するActivity
と、getButton
呼び出しは突然nullを返します!
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 コールバック後のアクティビティ)
何が起こっているのか分かりますか?それとも、初期化コールバック フックで何が間違っていたのでしょうか?
更新コールバックを起動する前にボタンが null ではないことを確認しても、それでもクラッシュしますか?!
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
if (_didLoadCallback != null && getButton() != null)
{
_didLoadCallback.callback();
}
}