欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在Fragment中监听返回键

程序员文章站 2022-06-08 17:58:15
...

最近在做项目的时候,遇见这么一个需求,需要在Fragment中监听返回键,点击返回键的时候做一些处理。

如图所示:当我需要处理fragment的返回事件时,这个时候拦截Activity对返回键的处理,先处理fragment中的逻辑,不需要时,直接交给activity处理即可。

在Fragment中监听返回键

其实实现的方式很简单,就是在activity中调fragment的返回事件即可。

代码示例:
首先我们写项目的时候一般都会对Fragment和Activity进行封装,我们先来写一个Fragment的基类,这里我封装了对返回键的处理.

package com.esp.testfragmentback;
import android.util.Log;
/**
 * Created by yzq on 2017/8/30.
 * 封装一个Fragment
 */
public class Fragment extends android.support.v4.app.Fragment {

    /*
     * fragment中的返回键
     *
     * 默认返回flase,交给Activity处理
     * 返回true:执行fragment中需要执行的逻辑
     * 返回false:执行activity中的 onBackPressed
     * */
    public boolean onBackPressed() {
        return false;
    }


}

Activity中的代码:
在Activity中的onBackPressed进行判断即可

   @Override
    public void onBackPressed() {
        List<Fragment> fragments = getSupportFragmentManager().getFragments();

        for (Fragment fragment : fragments) {
            /*如果是自己封装的Fragment的子类  判断是否需要处理返回事件*/
            if (fragment instanceof com.esp.testfragmentback.Fragment) {
                if (((com.esp.testfragmentback.Fragment) fragment).onBackPressed()) {
                    /*在Fragment中处理返回事件*/
                    return;
                }
            }
        }
        super.onBackPressed();
    }

具体的Fragment:
重写父类的onBackPressed即可,在这里面做处理

    /*重写父类的onBackPressed*/
    public boolean onBackPressed() {

        if (isHandleBack) {
            Toast.makeText(getActivity(), "点击了返回键", Toast.LENGTH_SHORT).show();
            return isHandleBack;
        }

        return isHandleBack;
    }

Fragment的全部代码:

package com.esp.testfragmentback;


import android.os.Bundle;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;


/**
 * A simple {@link Fragment} subclass.
 */
public class OneFragment extends Fragment implements View.OnClickListener {

    private boolean isHandleBack = false;

    private Button trueBtn, falseBtn;
    public OneFragment() {

    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_one, container, false);

        trueBtn = view.findViewById(R.id.trueBtn);
        falseBtn = view.findViewById(R.id.falseBtn);

        trueBtn.setOnClickListener(this);
        falseBtn.setOnClickListener(this);

        return view;
    }


    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.trueBtn:
                isHandleBack = true;
                break;

            case R.id.falseBtn:
                isHandleBack = false;
                break;
        }
    }



    /*重写父类的onBackPressed*/
    public boolean onBackPressed() {

        if (isHandleBack) {
            Toast.makeText(getActivity(), "点击了返回键", Toast.LENGTH_SHORT).show();
            return isHandleBack;
        }

        return isHandleBack;
    }
}

下面是demo,csdn现在强制要积分了,最低1分,我也很绝望啊

demo

相关标签: Fragment返回