• 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))

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

  • 相关阅读:
    实体类实现序列化
    异常处理
    Springboot的模块化使用
    Springboot的开始
    RxJava用法
    okhttp的Post方式
    OKhttp使用
    soundPool声音池
    ScheduledExecutor定时器
    timer定时器
  • 原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_fragment_15722133.html
Copyright © 2020-2023  润新知