Android 操作栏的片段生命周期问题
Android fragment lifecycle issue with actionbar
我想用下面的代码实现片段的导航:
public abstract class BaseFragment extends Fragment {
private static String TAG = "BaseFragment";
private BaseFragmentActions baseFragmentActions;
@Override
public void onAttach(Context context) {
super.onAttach(context);
Activity activity = null;
if (context instanceof Activity){
activity = (Activity) context;
}
Log.i(TAG, "onAttach = ");
try {
baseFragmentActions = (BaseFragmentActions)activity;
} catch (ClassCastException e) {
}
Log.i("onAttach",""+(getBackStackCount()!=0));
baseFragmentActions.resetToolbarNavigation(getBackStackCount()!=0);
}
@Override
public void onDetach() {
super.onDetach();
Log.i("BaseFragment", "onDestroy = " + (getBackStackCount() - 1));
baseFragmentActions.resetToolbarNavigation((getBackStackCount() - 1) != 0);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
private int getBackStackCount() {
int b = getActivity().getSupportFragmentManager().getBackStackEntryCount();
Log.i("getBackStackEntryCount", "====== "+b);
return b;
}
public interface BaseFragmentActions {
public void resetToolbarNavigation(boolean backNavigationEnabled);
}
}
我所有的片段都扩展了这个 Base Activity。在我的主要 activity 中,我实现了 BaseFragmentActions,并实现了这个方法:
@Override
public void resetToolbarNavigation(boolean backNavigationEnabled) {
Log.i("BaseActivity", "reset " + backNavigationEnabled);
getSupportActionBar().setDisplayHomeAsUpEnabled(backNavigationEnabled);
if (backNavigationEnabled) {
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i("resetToolbarNavigation", "setNavigationOnClickListener");
onBackPressed();
}
});
} else {
initNavigation();
syncState();
}
}
一切正常,但是当我更改屏幕方向时,我们收到 getSupportActionBar = null 错误。
这是因为我称之为 going attach。我该如何解决这个错误?我试图检查 getSupportActionBar 是否不为零。我没有收到错误,但是 "up" 箭头替换了汉堡包...
建议您在这种情况下可以做什么。还共享链接以导航此类片段的实现。对不起,如果写错了,或者我犯了语法错误))。
您好,很抱歉延迟回答,您遇到的问题是因为调用 onAttach 时尚未设置 getSupportActionBar(),相反您需要确保 Activity 已创建与 Activity 组件交互时,只需将调用放在 Fragment 的 onActivityCreated 方法中,如下所示:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
baseFragmentActions.resetToolbarNavigation(getBackStackCount()!=0);
}
我想用下面的代码实现片段的导航:
public abstract class BaseFragment extends Fragment {
private static String TAG = "BaseFragment";
private BaseFragmentActions baseFragmentActions;
@Override
public void onAttach(Context context) {
super.onAttach(context);
Activity activity = null;
if (context instanceof Activity){
activity = (Activity) context;
}
Log.i(TAG, "onAttach = ");
try {
baseFragmentActions = (BaseFragmentActions)activity;
} catch (ClassCastException e) {
}
Log.i("onAttach",""+(getBackStackCount()!=0));
baseFragmentActions.resetToolbarNavigation(getBackStackCount()!=0);
}
@Override
public void onDetach() {
super.onDetach();
Log.i("BaseFragment", "onDestroy = " + (getBackStackCount() - 1));
baseFragmentActions.resetToolbarNavigation((getBackStackCount() - 1) != 0);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
private int getBackStackCount() {
int b = getActivity().getSupportFragmentManager().getBackStackEntryCount();
Log.i("getBackStackEntryCount", "====== "+b);
return b;
}
public interface BaseFragmentActions {
public void resetToolbarNavigation(boolean backNavigationEnabled);
}
}
我所有的片段都扩展了这个 Base Activity。在我的主要 activity 中,我实现了 BaseFragmentActions,并实现了这个方法:
@Override
public void resetToolbarNavigation(boolean backNavigationEnabled) {
Log.i("BaseActivity", "reset " + backNavigationEnabled);
getSupportActionBar().setDisplayHomeAsUpEnabled(backNavigationEnabled);
if (backNavigationEnabled) {
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i("resetToolbarNavigation", "setNavigationOnClickListener");
onBackPressed();
}
});
} else {
initNavigation();
syncState();
}
}
一切正常,但是当我更改屏幕方向时,我们收到 getSupportActionBar = null 错误。 这是因为我称之为 going attach。我该如何解决这个错误?我试图检查 getSupportActionBar 是否不为零。我没有收到错误,但是 "up" 箭头替换了汉堡包...
建议您在这种情况下可以做什么。还共享链接以导航此类片段的实现。对不起,如果写错了,或者我犯了语法错误))。
您好,很抱歉延迟回答,您遇到的问题是因为调用 onAttach 时尚未设置 getSupportActionBar(),相反您需要确保 Activity 已创建与 Activity 组件交互时,只需将调用放在 Fragment 的 onActivityCreated 方法中,如下所示:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
baseFragmentActions.resetToolbarNavigation(getBackStackCount()!=0);
}