今天在做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))

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

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. 安卓Gallery配合ImageSwitcher不显示图片

    Gallary装的是缩略图(thumb),ImageSwitcher装的是大图. 不显示图片的一个可能原因是gallery没设置代理器,另一个原因是没使用相对布局. GalleryActivity.j ...

  2. 水池接雨水的经典问题I&II

    https://leetcode.com/problems/trapping-rain-water https://leetcode.com/problems/trapping-rain-water- ...

  3. BZOJ2020: [Usaco2010 Jan]Buying Feed II

    [传送门:BZOJ2020] 简要题意: 约翰开车回家,遇到了双十一节,那么就顺路买点饲料吧.回家的路程一共有E 公里,这一路上会经过N 家商店,第i 家店里有Fi 吨饲料,售价为每吨Ci 元.约翰打 ...

  4. assert 的理解

    assert 可以实现如下功能: 保证参数之间的大小等约束关系: 函数执行过程中得到的中间结果是否符合预期: def gen_batch(batch_size, skip_window, num_sk ...

  5. 流量数据iftop命令

    yum install flex byacc libpcap ncurses ncurses-devel libpcap-devel tar zxvf iftop-0.17.tar.gz cd ift ...

  6. 129.C++面试一百题(1-51)

  7. 关于HTML5和CSS3的几个“新增”

    html5和css3分别是目前最新的web前端编程的标准,加入了新的标准和要求. 1.HTML5新增input输入类型,即type后面的值 文本域 <input type="text& ...

  8. react 常用的ui库

    1. https://ant.design/docs/react/introduce-cn   ANT DESIGNui 2. http://www.material-ui.com/#/   Mate ...

  9. Mysql数据库常规操作(建表、查询)

    一.表单操作 1-1.创建表 create table tb_name( id in primary key auto_increment);    1-2.查看表 desc table_name; ...

  10. Fedora 29 Linux发行版发布,新功能使Web开发人员的工作更方便

    Matthew Miller宣布发布Fedora 29.这个项目的最新版本是在Fedora Core 1发布后几乎整整15年才发布的,并且可以在多个版本中用于多个体系结构. 最新版本的Fedora已经 ...