Fragment-按返回键程序退出

今天在做fragment的时候,发现一个问题,当我的界面停留在fragment的时候,按物理返回键,这时候会推出整个应用。这当然不是我们期望的,我们期望按返回键以后,应用界面返回添加fragment之前的界面。后来就在网上查了相关的方法,发现有个关于入栈的概念,现在记录如下。

一下文章参考 http://blog.csdn.net/lmj623565791/article/details/37992017 这个博客感觉很厉害,写的东西很好

我们先看下没有做处理的时候,fragment按返回键的结果

作为实例,我们创建三个fragment,他们就是显示三个不同的字符串,就不一一列出了。

package com.example.test1123;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ListView;

public class HistoryFragmentTwo extends Fragment {
    private View mView;
    private ListView mListView;
    private Button mClearHistoryBtn;
    private Button mBackCalculatorBtn;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mView = inflater.inflate(R.layout.notify_two, container, false);
        if (mView != null) {

            return mView;
        } else {
            return super.onCreateView(inflater, container, savedInstanceState);
        }

    }

    public interface HistoryClickListener {
        void clickListen();
    }
}

主代码如下

bt1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
            getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragment()).commit();    
            }
        });
        bt2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
            getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTwo()).commit();    
            }
        });
        bt3.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTh()).commit();
            }

        });

在一个activity中加三个fragment,我们看下效果

我们发现,按下返回按钮以后,界面直接退出来了,下面我们进行下修改。

bt1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
            getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragment())
            .addToBackStack(null).commit();    
            }
        });
        bt2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
            getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTwo())
            .addToBackStack(null).commit();    
            }
        });
        bt3.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTh()).commit();
            }

        });

这个里面其实增加了一个入栈操作

addToBackStack(null)

然后我们看下效果

从上面我们可以发现,addToBackStack(null) 这个方法,其实是把当前的一次操作入栈,给人的感觉是,把之前的界面记录下来,当我们按下反回键的时候,会把记录的界面重新调出来。

main---(add fragment1 addToBackStack)【这时候main界面就会如栈,在这个界面按返回键,会退回到main】

main---(add fragment1 addToBackStack)【这时候main界面就会如栈,在这个界面按返回键,会退回到main】---(add fragment2 addToBackStack)【这时候fragment1界面就会如栈,在这个界面按返回键,会退回到fragment1,然后再按,回到main))

main---(add fragment1 addToBackStack)【这时候main界面就会如栈,在这个界面按返回键,会退回到main】---(add fragment2)---(add fragment3)【这时候只有main界面在栈里,在这个界面按返回键,会调出main))

其实对这个问题理解的还是不清楚,随着知识点累积,以后再看吧

原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_fragment_15722133.html