【问题标题】:Fragment is not restored after app process is killed应用进程被杀死后片段不恢复
【发布时间】:2017-11-23 20:44:19
【问题描述】:

我有一个与 recyclerview 相关的活动。在 recyclerview 的适配器中,当用户点击元素时,会创建一个新的 Fragment。问题是当我按下主页按钮时,杀死应用程序进程然后恢复应用程序,片段没有重新创建。应用进程被杀死后如何恢复片段?

编辑:

我在活动中的 onCreate 方法:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        context = this;

        rvMain = (RecyclerView) findViewById(R.id.rvMain);
        rvMain.setLayoutManager(new LinearLayoutManager(context));
        MainAdapter adapter = new MainAdapter(numbers, context);
        rvMain.setAdapter(adapter);
    } 

调用片段的recyclerview适配器中的onBindViewHolder方法:

    @Override
    public void onBindViewHolder(MainViewHolder holder, final int position) {
        final Number number = numbers.get(position);

        holder.lytMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DetailedFragment fragment = new DetailedFragment();
                Bundle bundle = new Bundle();
                bundle.putString("message", number.getName());
                fragment.setArguments(bundle);

                ((MainActivity) context).getSupportFragmentManager().beginTransaction()
                        .addToBackStack("fragment")
                        .replace(R.id.lytDetailed, fragment)
                        .commit();

            }
        });


    }

【问题讨论】:

  • 你能发布你的代码吗?
  • @YusufÇağlar 添加了一些代码
  • addToBackStack 为我完成这项工作

标签: android android-fragments android-lifecycle


【解决方案1】:

我找到了一个解决方案,我将调用片段转移到 MainActivity 中的一个方法,然后我使用 onSaveInstanceState 保存片段实例并使用 onRestoreInstanceState 恢复它。这是它的外观。

适配器中的onBindViewHolder:

    @Override
    public void onBindViewHolder(MainViewHolder holder, final int position) {
        final Number number = numbers.get(position);

        holder.lytMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((MainActivity)context).getFragment(number);
            }
        });
    }

MainActivity 中的getFragment() 方法:

    public void getFragment(Number number){
        fragment = new DetailedFragment();
        Bundle bundle = new Bundle();
        bundle.putString("message", number.getName());
        fragment.setArguments(bundle);

        getSupportFragmentManager().beginTransaction()
                .addToBackStack("fragment")
                .replace(R.id.lytDetailed, fragment)
                .commit();
    }

onSaveInstanceState 和 onRestoreInstanceState:

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getSupportFragmentManager().putFragment(outState, "detailed_fragment", fragment);
    }

    @Override
    protected void onRestoreInstanceState(Bundle outState) {
        super.onRestoreInstanceState(outState);
            fragment = (DetailedFragment) getSupportFragmentManager()
                    .getFragment(outState, "detailed_fragment");

            getSupportFragmentManager().beginTransaction()
                    .addToBackStack("fragment")
                    .replace(R.id.lytDetailed, fragment)
                    .commit();
    }

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多