zoukankan      html  css  js  c++  java
  • Android 使用Fragment界面向下跳转并一级级返回

    1.首先贴上项目结构图:

    2.先添加一个接口文件BackHandledInterface.java,定义一个setSelectedFragment方法用于设置当前加载的Fragment在栈顶,主界面MainActivity须实现此接口,代码如下:

    package com.example.testdemo;
    
    public interface BackHandledInterface {
    
        public abstract void setSelectedFragment(BackHandledFragment selectedFragment);
    }

    3.定义一个抽象类BackHandledFragment继承自Fragment,后面跳转的Fragment界面都要继承自BackHandledFragment。抽象类BackHandledFragment中定义一个返回值为boolean类型的onBackPressed方法,用于处理点击返回按键(物理Back键)时的逻辑,若该方法返回false,表示当前Fragment不消费返回事件,而由Fragment所属的FragmentActivity来处理这个事件。代码如下:

    package com.example.testdemo;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    
    public abstract class BackHandledFragment extends Fragment {
    
        protected BackHandledInterface mBackHandledInterface;
    
        /**
         * 所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑
         */
        protected abstract boolean onBackPressed();
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (!(getActivity() instanceof BackHandledInterface)) {
                throw new ClassCastException(
                        "Hosting Activity must implement BackHandledInterface");
            } else {
                this.mBackHandledInterface = (BackHandledInterface) getActivity();
            }
        }
    
        @Override
        public void onStart() {
            super.onStart();
            // 告诉FragmentActivity,当前Fragment在栈顶
            mBackHandledInterface.setSelectedFragment(this);
        }
    
    }

    4.主界面MainActivity要继承FragmentActivity才能调用getSupportFragmentManager()方法来处理Fragment。MainActivity还需重写onBackPressed方法用来捕捉返回键(Back Key)事件,代码如下:

    package com.example.testdemo;
    
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends FragmentActivity implements
            BackHandledInterface {
        private static MainActivity mInstance;
        private BackHandledFragment mBackHandedFragment;
        private Button btnSecond;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btnSecond = (Button) findViewById(R.id.btnSecond);
            btnSecond.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    FirstFragment first = new FirstFragment();
                    loadFragment(first);
                    btnSecond.setVisibility(View.GONE);
                }
            });
    
        }
    
        public static MainActivity getInstance() {
            if (mInstance == null) {
                mInstance = new MainActivity();
            }
            return mInstance;
        }
    
        public void loadFragment(BackHandledFragment fragment) {
            BackHandledFragment second = fragment;
            FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.firstFragment, second, "other");
            ft.addToBackStack("tag");
            ft.commit();
        }
    
        @Override
        public void setSelectedFragment(BackHandledFragment selectedFragment) {
            this.mBackHandedFragment = selectedFragment;
        }
    
        @Override
        public void onBackPressed() {
            if (mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()) {
                if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
                    super.onBackPressed();
                } else {
                    if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
                        btnSecond.setVisibility(View.VISIBLE);
                    }
                    getSupportFragmentManager().popBackStack();
                }
            }
        }
    }

    5.分别添加两个子级Fragment,FirstFragment.java和SecondFragment.java,代码分别如下:

    FirstFragment.java

    package com.example.testdemo;
    
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.Button;
    
    public class FirstFragment extends BackHandledFragment {
        private View myView;
        private Button btnSecond;
    
        @Override
        public View onCreateView(LayoutInflater inflater,
                @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            myView = inflater.inflate(R.layout.fragment_first, null);
            initView();
            return myView;
        }
    
        private void initView() {
            btnSecond = (Button) myView.findViewById(R.id.btnSecond);
            btnSecond.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    SecondFragment second = new SecondFragment();
                    FragmentManager fm = getFragmentManager();
                    FragmentTransaction ft = fm.beginTransaction();
                    ft.replace(R.id.firstFragment, second);
                    ft.addToBackStack("tag");
                    ft.commit();
                }
            });
        }
    
        @Override
        protected boolean onBackPressed() {
            return false;
        }
    
    }

    SecondFragment.java

    package com.example.testdemo;
    
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class SecondFragment extends BackHandledFragment {
    
        private View mView;
    
        @Override
        public View onCreateView(LayoutInflater inflater,
                @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            mView = inflater.inflate(R.layout.fragment_second, null);
            return mView;
        }
    
        @Override
        protected boolean onBackPressed() {
            return false;
        }
    
    }

    6.三个布局文件代码如下:
    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="FragmentActivity 父界面"
            android:textSize="26sp" />
    
        <Button
            android:id="@+id/btnSecond"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:text="跳转到FirstFragment" />
    
        <FrameLayout
            android:id="@+id/firstFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </FrameLayout>
    
    </RelativeLayout>

    fragment_first.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#e5e5e5"
        android:orientation="vertical" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="FirstFragment"
            android:textColor="#000000"
            android:textSize="26sp" />
    
        <Button
            android:id="@+id/btnSecond"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:text="打开SecondFragment" />
    
    </RelativeLayout>

    fragment_second.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#e5e5e5"
        android:orientation="vertical" >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="SecondFragment"
            android:textColor="#000000"
            android:textSize="26sp" />
    
    </RelativeLayout>
  • 相关阅读:
    Ubuntu上如何安装Java,Eclipse,Pydev,Python(自带,不用装),BeautifulSoup
    sed替换字符串时,使用正则表达式的注意事项
    shell实现trim函数-去除字符串两侧的空格(包括tab,space键)
    能用Shell就别编程-海量文本型数据的处理
    grep与egrep
    海量数据导入MySQL的注意事项
    Java读取文件
    Python爬虫经验
    Java字符串split函数的注意事项
    shiro+jwt+springboot理解
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5453621.html
Copyright © 2011-2022 走看看