按下后退时片段未附加到 Activity
Fragment not attached to Activity when back pressed
我有一个 fragment 的实现,正如 here 所解释的那样。我扩展了 BaseFragment class 来处理导航图标 onClickListener。代码如下所示,
private void onBackButtonPressed(int tag)
{
switch (tag)
{
case Global.DISPLAY_STORE:
{
setTitle("Loyalty Cards",Color.BLACK);
setToolBar(getResources().getColor(R.color.white), Global.ADD_CARD,R.drawable.add_round_btn);
break;
}
case Global.ADD_CARD:
{
setTitle("Wallet", Color.WHITE);
setToolBar(getResources().getColor(R.color.colorPrimary), Global.DISPLAY_STORE,R.drawable.icon_shopping);
getFragmentManager().popBackStack();
break;
}
case Global.CARD_DETAILS:
{
setTitle("Loyalty Cards",Color.BLACK);
setToolBar(getResources().getColor(R.color.white), Global.ADD_CARD,R.drawable.add_round_btn);
getFragmentManager().popBackStack();
break;
}
}
}
当后退按钮为 pressed.This 代码驻留在 BaseFragment 中时,我正在使用此代码块更改工具栏图标和颜色。
下面是我如何实现代码来处理后退,
我的片段扩展了 BaseFragment
public class CardDetailsFragment extends BaseFragment
现在在 BaseFragment onCreate 中我有这段代码,
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainActivity = (MainActivity) getActivity();
ImageButton righBarButton = (ImageButton) mainActivity.getToolbar().findViewById(R.id.btn_ToolBarRightBtn);
righBarButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onRighBarButtonClicked(Integer.parseInt(v.getTag().toString()));
}
});
mainActivity.getToolbar().setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackButtonPressed(BACK_BUTTON_TAG);
}
});
getFragmentManager().addOnBackStackChangedListener(this);
shouldDisplayHomeUp();
}
由此处理每个片段的后退按钮按下和工具栏中的右栏按钮项目单击。
考虑我有三个片段 A、B 和 C 的场景。
我从片段 A 打开片段 B,然后打开片段 C。现在从片段 C,我单击后退按钮到达片段 B。后退按钮事件由上面的代码处理并且工作正常。
现在,我从 Fragment B 单击后退按钮到达 Fragment A。但是当我单击后退按钮时出现异常
java.lang.IllegalStateException: Fragment CardDetailsFragment{d8b35b5} not attached to Activity
at android.support.v4.app.Fragment.getResources(Fragment.java:636)
here the CardDetailsFragment is the FragmentC, but I am clicking the
back button from Fragment B
用户第一次按下后退按钮时,不再需要片段 C,因此它与 activity 分离。问题在于,即使 Fragment C 被分离,它仍然被注册为后台堆栈更改事件的侦听器。
用户第二次按下后退按钮时,您的 onBackStackPressed()
方法在 Fragment C 中被调用。执行 getResources()
时,没有 activity 附件,因此 getResources()
失败。
您片段中的类似内容应该可以解决:
@Override
public void onDestroy() {
getFragmentManager().removeOnBackStackChangedListener(this);
super.onDestroy();
}
我有一个 fragment 的实现,正如 here 所解释的那样。我扩展了 BaseFragment class 来处理导航图标 onClickListener。代码如下所示,
private void onBackButtonPressed(int tag)
{
switch (tag)
{
case Global.DISPLAY_STORE:
{
setTitle("Loyalty Cards",Color.BLACK);
setToolBar(getResources().getColor(R.color.white), Global.ADD_CARD,R.drawable.add_round_btn);
break;
}
case Global.ADD_CARD:
{
setTitle("Wallet", Color.WHITE);
setToolBar(getResources().getColor(R.color.colorPrimary), Global.DISPLAY_STORE,R.drawable.icon_shopping);
getFragmentManager().popBackStack();
break;
}
case Global.CARD_DETAILS:
{
setTitle("Loyalty Cards",Color.BLACK);
setToolBar(getResources().getColor(R.color.white), Global.ADD_CARD,R.drawable.add_round_btn);
getFragmentManager().popBackStack();
break;
}
}
}
当后退按钮为 pressed.This 代码驻留在 BaseFragment 中时,我正在使用此代码块更改工具栏图标和颜色。
下面是我如何实现代码来处理后退,
我的片段扩展了 BaseFragment
public class CardDetailsFragment extends BaseFragment
现在在 BaseFragment onCreate 中我有这段代码,
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainActivity = (MainActivity) getActivity();
ImageButton righBarButton = (ImageButton) mainActivity.getToolbar().findViewById(R.id.btn_ToolBarRightBtn);
righBarButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onRighBarButtonClicked(Integer.parseInt(v.getTag().toString()));
}
});
mainActivity.getToolbar().setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackButtonPressed(BACK_BUTTON_TAG);
}
});
getFragmentManager().addOnBackStackChangedListener(this);
shouldDisplayHomeUp();
}
由此处理每个片段的后退按钮按下和工具栏中的右栏按钮项目单击。
考虑我有三个片段 A、B 和 C 的场景。
我从片段 A 打开片段 B,然后打开片段 C。现在从片段 C,我单击后退按钮到达片段 B。后退按钮事件由上面的代码处理并且工作正常。
现在,我从 Fragment B 单击后退按钮到达 Fragment A。但是当我单击后退按钮时出现异常
java.lang.IllegalStateException: Fragment CardDetailsFragment{d8b35b5} not attached to Activity
at android.support.v4.app.Fragment.getResources(Fragment.java:636)
here the CardDetailsFragment is the FragmentC, but I am clicking the back button from Fragment B
用户第一次按下后退按钮时,不再需要片段 C,因此它与 activity 分离。问题在于,即使 Fragment C 被分离,它仍然被注册为后台堆栈更改事件的侦听器。
用户第二次按下后退按钮时,您的 onBackStackPressed()
方法在 Fragment C 中被调用。执行 getResources()
时,没有 activity 附件,因此 getResources()
失败。
您片段中的类似内容应该可以解决:
@Override
public void onDestroy() {
getFragmentManager().removeOnBackStackChangedListener(this);
super.onDestroy();
}