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

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

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

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

  1. package com.example.test1123;
  2.  
  3. import android.app.Fragment;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.Button;
  9. import android.widget.ListView;
  10.  
  11. public class HistoryFragmentTwo extends Fragment {
  12. private View mView;
  13. private ListView mListView;
  14. private Button mClearHistoryBtn;
  15. private Button mBackCalculatorBtn;
  16.  
  17. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  18. Bundle savedInstanceState) {
  19. mView = inflater.inflate(R.layout.notify_two, container, false);
  20. if (mView != null) {
  21.  
  22. return mView;
  23. } else {
  24. return super.onCreateView(inflater, container, savedInstanceState);
  25. }
  26.  
  27. }
  28.  
  29. public interface HistoryClickListener {
  30. void clickListen();
  31. }
  32. }

主代码如下

  1. bt1.setOnClickListener(new OnClickListener() {
  2. @Override
  3. public void onClick(View arg0) {
  4. getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragment()).commit();
  5. }
  6. });
  7. bt2.setOnClickListener(new OnClickListener() {
  8.  
  9. @Override
  10. public void onClick(View arg0) {
  11. getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTwo()).commit();
  12. }
  13. });
  14. bt3.setOnClickListener(new OnClickListener() {
  15.  
  16. @Override
  17. public void onClick(View arg0) {
  18. getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTh()).commit();
  19. }
  20.  
  21. });

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

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

  1. bt1.setOnClickListener(new OnClickListener() {
  2. @Override
  3. public void onClick(View arg0) {
  4. getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragment())
  5. .addToBackStack(null).commit();
  6. }
  7. });
  8. bt2.setOnClickListener(new OnClickListener() {
  9.  
  10. @Override
  11. public void onClick(View arg0) {
  12. getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTwo())
  13. .addToBackStack(null).commit();
  14. }
  15. });
  16. bt3.setOnClickListener(new OnClickListener() {
  17.  
  18. @Override
  19. public void onClick(View arg0) {
  20. getFragmentManager().beginTransaction().replace(R.id.frame, new HistoryFragmentTh()).commit();
  21. }
  22.  
  23. });

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

  1. 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))

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

Fragment-按返回键程序退出的更多相关文章

  1. Fragment响应返回键

    Activty可以直接响应返回键,而Fragment却不行,可用如下方式: 创建一个抽象类BackHandledFragment,该类中有一个抽象方法onBackPress(),所有BackHandl ...

  2. vue 用huilder打包APP时,安卓按返回键就退出App改为按两次再退出App

    做vue项目时,用Hbuilder打包APP,在安卓下按返回键就是退出了APP,百度了下.都是使用到MUI来解决的,自己也记录下. 在main.js里面引入mui.js并使用. import mui ...

  3. 解决Hbuilder打包的apk文件按手机返回键直接退出软件

    问题描述:Hbuilder打包的app如果点击手机返回键,app会直接退出,返回不了上一页. 写在公共js文件中,每个页面均引入该js,代码如下: document.addEventListener( ...

  4. Android 应用按返回键异常退出的问题

    开发过程中遇到按返回键异常退出的问题,log显示为空指针异常,进一步产看是由于onActivityResult得到的Intent为空. 按返回键复写代码例如以下: @Override public v ...

  5. Unity响应Android的返回键,退出当前Activity

    一:使用 Application.Quit() public void Update() { if(Input.GetKeyDown(KeyCode.Escape)) Application.Quit ...

  6. Android实现两次点击返回键提示退出

    Android的很多app中,都有点击一次返回键提示再次点击退出app的功能. 今天就看了下实现的方式,其实就是在相应的Activity中重写了onKeyDown()方法.在onKeyDown()方法 ...

  7. Android 两步搞定Fragment的返回键

    Fragment可以说是在Android开发必需要使用到技术,项目中的界面基本上都是使用Fragment来实现,而Activity只是作为Fragment的载体,但有些特殊情况下Fragment也不得 ...

  8. Back键和Menu键程序退出弹窗以及按钮退出程序弹窗的实现

    MainActivity.java package com.loaderman.backmenudemo; import android.content.Intent; import android. ...

  9. Android Studio 点击两次返回键,退出APP

    该功能的实现没有特别复杂,主要在onKeyDown()事件中实现,直接上代码,如下: //第一次点击事件发生的时间 private long mExitTime; /** * 点击两次返回退出app ...

随机推荐

  1. COGS——T1588. [USACO FEB04]距离咨询

    http://cogs.pro/cogs/problem/problem.php?pid=1588 ★★   输入文件:dquery.in   输出文件:dquery.out   简单对比时间限制:1 ...

  2. 洛谷 P1176 路径计数2

    P1176 路径计数2 题目描述 一个N×N的网格,你一开始在(1, 1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N, N),即右下角有多少种方法. 但是这个问题太简单了, ...

  3. [递推+dfs]ZOJ 3436. July Number

    题目大意: 将一个数字的相邻两位的差(的绝对值)组成一个新的数字.不断反复.假设最后得到7,就称这个数为July Number,比方9024 – 922 – 70 – 7. 题目要求1e9范围内给定区 ...

  4. Hadoop2.2集群安装配置-Spark集群安装部署

    配置安装Hadoop2.2.0 部署spark 1.0的流程 一.环境描写叙述 本实验在一台Windows7-64下安装Vmware.在Vmware里安装两虚拟机分别例如以下 主机名spark1(19 ...

  5. Linux 服务器下多网卡的负载均衡

    Linux 服务器下多网卡负载均衡的实现   一.引言    现今几乎各行各业内部都建立了自己的服务器,由于服务器的特殊地位,它的可靠性.可用性及其 I/O 速度就显得非常的重要, 保持服务器的高可用 ...

  6. 学习思考:思考>努力

    学.习.思.考 学习.思考,这2个词,4个字,其实代表了4个不同的动作:学.习.思.考. 学,就是从外部(他人)获得. 习,就是练习,行动. 思,就是从内部(自己)获得. 考,就是考量,检测. 因此, ...

  7. webpack+react实现echarts可视化配置

    先上效果 开发环境要求 需要事先安装node及npm 前期准备 1.创建文件夹react-echarts-editor2.在项目根目录(以下称根目录)下创建src目录3.在项目根目录下创建dist目录 ...

  8. 学习参考《TensorFlow深度学习》高清中文版PDF+英文版PDF+源代码

    我们知道,TensorFlow是比较流行的深度学习框架,除了看手册文档外,推荐大家看看<Tensorflow深度学习>,共分5方面内容:基础知识.关键模块.算法模型.内核揭秘.生态发展.前 ...

  9. Scrapy请求传参

    scrapy.Request(url=url, callback=self.parse_item, meta={'item': item}, headers=headers) url: 要请求的地址 ...

  10. 紫书 习题 10-18 UVa 10837 (欧拉函数变形)

    这道题很巧妙,要把式子变一下 phi(n) = n * (1 - 1 / p1) * (1 - 1 / p2)--(1 - 1 / pr) = n * ((p1-1) / p1) * ((p1-2) ...