反压后片段未附加到活动

时间:2016-05-19 20:30:49

标签: android android-fragments fragment-backstack

我有一个片段的实现,如here所述。我已经扩展了BaseFragment类来处理导航图标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;
            }
        }

    }

我正在使用此代码块在按下后退按钮时更改ToolBar图标和颜色。此代码位于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.后退按钮事件由上面的代码处理,它工作正常。

现在从片段B,我点击后退按钮到达片段A.但是当我点击后退按钮时我得到了异常

java.lang.IllegalStateException: Fragment CardDetailsFragment{d8b35b5} not attached to Activity
                                                                                    at android.support.v4.app.Fragment.getResources(Fragment.java:636)
  

这里的CardDetailsFragment是FragmentC,但我点击了   片段B的后退按钮

1 个答案:

答案 0 :(得分:1)

用户第一次按下后退按钮时,不再需要片段C,因此它与活动分离。问题在于,即使Fragment C被分离,它仍然被注册为后备栈更改事件的监听器。

用户第二次按下后退按钮时,在片段C中调用onBackStackPressed()方法。执行getResources()时,没有活动附件,因此getResources()失败。

你片段中的这类内容应该修复它:

     @Override
     public void onDestroy() {
         getFragmentManager().removeOnBackStackChangedListener(this);
         super.onDestroy();
     }