Fragment-按返回键程序退出
今天在做fragment的时候,发现一个问题,当我的界面停留在fragment的时候,按物理返回键,这时候会推出整个应用。这当然不是我们期望的,我们期望按返回键以后,应用界面返回添加fragment之前的界面。后来就在网上查了相关的方法,发现有个关于入栈的概念,现在记录如下。
一下文章参考 http://blog.****.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))
其实对这个问题理解的还是不清楚,随着知识点累积,以后再看吧