【问题标题】:Fragment not attached to Activity when back pressed后按时片段未附加到 Activity
【发布时间】:2016-05-19 20:30:48
【问题描述】:

我有一个片段的实现,如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;
            }
        }

    }

当按下返回按钮时,我正在使用此代码块来更改工具栏图标和颜色。此代码位于 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,但我点击的是 Fragment B 的后退按钮

【问题讨论】:

  • 片段如何让事件调用onBackButtonPressed()
  • 我已经更新了 pst
  • 尝试将片段实例存储在 Back 堆栈中并在后按时加载它

标签: android android-fragments fragment-backstack


【解决方案1】:

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

用户第二次按下返回按钮时,你的onBackStackPressed()方法在Fragment C中被调用。当getResources()被执行时,没有活动附件所以getResources()失败。

片段中的类似内容应该可以修复它:

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

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 2011-10-15
    • 2018-01-26
    • 1970-01-01
    • 2014-03-06
    • 2021-09-02
    相关资源
    最近更新 更多