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来处理这个事件。代码如下:

 1 package com.example.testdemo;
2
3 import android.os.Bundle;
4 import android.support.v4.app.Fragment;
5
6 public abstract class BackHandledFragment extends Fragment {
7
8 protected BackHandledInterface mBackHandledInterface;
9
10 /**
11 * 所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑
12 */
13 protected abstract boolean onBackPressed();
14
15 @Override
16 public void onCreate(Bundle savedInstanceState) {
17 super.onCreate(savedInstanceState);
18 if (!(getActivity() instanceof BackHandledInterface)) {
19 throw new ClassCastException(
20 "Hosting Activity must implement BackHandledInterface");
21 } else {
22 this.mBackHandledInterface = (BackHandledInterface) getActivity();
23 }
24 }
25
26 @Override
27 public void onStart() {
28 super.onStart();
29 // 告诉FragmentActivity,当前Fragment在栈顶
30 mBackHandledInterface.setSelectedFragment(this);
31 }
32
33 }

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

 1 package com.example.testdemo;
2
3 import android.os.Bundle;
4 import android.support.v4.app.FragmentActivity;
5 import android.support.v4.app.FragmentManager;
6 import android.support.v4.app.FragmentTransaction;
7 import android.view.View;
8 import android.view.View.OnClickListener;
9 import android.widget.Button;
10
11 public class MainActivity extends FragmentActivity implements
12 BackHandledInterface {
13 private static MainActivity mInstance;
14 private BackHandledFragment mBackHandedFragment;
15 private Button btnSecond;
16
17 @Override
18 public void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.activity_main);
21 btnSecond = (Button) findViewById(R.id.btnSecond);
22 btnSecond.setOnClickListener(new OnClickListener() {
23
24 @Override
25 public void onClick(View v) {
26 FirstFragment first = new FirstFragment();
27 loadFragment(first);
28 btnSecond.setVisibility(View.GONE);
29 }
30 });
31
32 }
33
34 public static MainActivity getInstance() {
35 if (mInstance == null) {
36 mInstance = new MainActivity();
37 }
38 return mInstance;
39 }
40
41 public void loadFragment(BackHandledFragment fragment) {
42 BackHandledFragment second = fragment;
43 FragmentManager fm = getSupportFragmentManager();
44 FragmentTransaction ft = fm.beginTransaction();
45 ft.replace(R.id.firstFragment, second, "other");
46 ft.addToBackStack("tag");
47 ft.commit();
48 }
49
50 @Override
51 public void setSelectedFragment(BackHandledFragment selectedFragment) {
52 this.mBackHandedFragment = selectedFragment;
53 }
54
55 @Override
56 public void onBackPressed() {
57 if (mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()) {
58 if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
59 super.onBackPressed();
60 } else {
61 if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
62 btnSecond.setVisibility(View.VISIBLE);
63 }
64 getSupportFragmentManager().popBackStack();
65 }
66 }
67 }
68 }

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

FirstFragment.java

 1 package com.example.testdemo;
2
3 import android.os.Bundle;
4 import android.support.annotation.Nullable;
5 import android.support.v4.app.FragmentManager;
6 import android.support.v4.app.FragmentTransaction;
7 import android.view.LayoutInflater;
8 import android.view.View;
9 import android.view.View.OnClickListener;
10 import android.view.ViewGroup;
11 import android.widget.Button;
12
13 public class FirstFragment extends BackHandledFragment {
14 private View myView;
15 private Button btnSecond;
16
17 @Override
18 public View onCreateView(LayoutInflater inflater,
19 @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
20 myView = inflater.inflate(R.layout.fragment_first, null);
21 initView();
22 return myView;
23 }
24
25 private void initView() {
26 btnSecond = (Button) myView.findViewById(R.id.btnSecond);
27 btnSecond.setOnClickListener(new OnClickListener() {
28
29 @Override
30 public void onClick(View v) {
31 SecondFragment second = new SecondFragment();
32 FragmentManager fm = getFragmentManager();
33 FragmentTransaction ft = fm.beginTransaction();
34 ft.replace(R.id.firstFragment, second);
35 ft.addToBackStack("tag");
36 ft.commit();
37 }
38 });
39 }
40
41 @Override
42 protected boolean onBackPressed() {
43 return false;
44 }
45
46 }

SecondFragment.java

 1 package com.example.testdemo;
2
3 import android.os.Bundle;
4 import android.support.annotation.Nullable;
5 import android.view.LayoutInflater;
6 import android.view.View;
7 import android.view.ViewGroup;
8
9 public class SecondFragment extends BackHandledFragment {
10
11 private View mView;
12
13 @Override
14 public View onCreateView(LayoutInflater inflater,
15 @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
16 mView = inflater.inflate(R.layout.fragment_second, null);
17 return mView;
18 }
19
20 @Override
21 protected boolean onBackPressed() {
22 return false;
23 }
24
25 }

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

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical" >
6
7 <TextView
8 android:layout_width="wrap_content"
9 android:layout_height="wrap_content"
10 android:layout_centerInParent="true"
11 android:text="FragmentActivity 父界面"
12 android:textSize="26sp" />
13
14 <Button
15 android:id="@+id/btnSecond"
16 android:layout_width="wrap_content"
17 android:layout_height="wrap_content"
18 android:layout_alignParentBottom="true"
19 android:text="跳转到FirstFragment" />
20
21 <FrameLayout
22 android:id="@+id/firstFragment"
23 android:layout_width="match_parent"
24 android:layout_height="match_parent" >
25 </FrameLayout>
26
27 </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

 1 <?xml version="1.0" encoding="utf-8"?>
2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:background="#e5e5e5"
6 android:orientation="vertical" >
7
8 <TextView
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:layout_centerInParent="true"
12 android:text="SecondFragment"
13 android:textColor="#000000"
14 android:textSize="26sp" />
15
16 </RelativeLayout>

7.最后奉上实例链接:

http://files.cnblogs.com/_ymw/TestDemo

 

[转]Android 使用Fragment界面向下跳转并一级级返回的更多相关文章

  1. Android 使用Fragment界面向下跳转并一级级返回

    http://www.cnblogs.com/_ymw/p/4227862.html 1.首先贴上项目结构图: 2.先添加一个接口文件BackHandledInterface.java,定义一个set ...

  2. Android——实现欢迎界面的自动跳转(转)

    Android实现欢迎界面的自动跳转,就是打开某一个安卓手机应用,出现的欢迎界面停留几秒钟,自动进入应用程序的主界面.在网上看到很多种实现办法,但是感觉这种方法还是比较简单的. 在onCreate里设 ...

  3. Android横屏下Fragment界面重叠问题

    前言: 项目是基于平板开发的,设计的界面是要求横屏展示界面.所以我将所有的Activity都强制设置为横屏 android:screenOrientation="landscape" ...

  4. Android Fragment解析(下)

    今天被人问到了什么是Fragment,真是一头雾水,虽然以前也用到过,但不知道它是叫这个名字,狂补一下. 以下内容来自互联网,原文链接:http://blog.csdn.net/lmj62356579 ...

  5. Android Fragment学习笔记(二)----Fragment界面添加和管理

    Fragment界面添加 了解过fragment的生命周期等简单知识,于是去看官方文档来了解更多相关内容,要添加fragment到我们的UI界面中,给出了两种常用的方法,第一个是在activity的布 ...

  6. Android从Fragment跳转到Activity

    代码改变世界 Android从Fragment跳转到Activity Intent intent = new Intent(getActivity(), LoginActivity.class); s ...

  7. Android之Activity界面跳转--生命周期方法调用顺序

    这本是一个很基础的问题,很惭愧,很久没研究这一块了,已经忘得差不多了.前段时间面试,有面试官问过这个问题.虽然觉得没必要记,要用的时候写个Demo,打个Log就清楚了.但是今天顺手写了个Demo,也就 ...

  8. Android之Fragment(二)

    本文主要内容 如何管理Fragment回退栈 Fragment如何与Activity交互 Fragment与Activity交互的最佳实践 没有视图的Fragment的用处 使用Fragment创建对 ...

  9. Android开发——Fragment知识整理(一)

    0.  前言 Fragment,顾名思义是片段的意思,可以把Fragment当成Activity的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成.Fragment需要被嵌 ...

随机推荐

  1. Android中@id与@+id区别

    Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@后 ...

  2. Undefined symbols for architectureIOS

    IOS问题解决. 现在进行老项目的编译,发现不能编译. 经过各种盲目查询,找个几个方案. 1.builde setting修改编译方式. 2.Builde Phases(修改). 2.1.库. 2.1 ...

  3. mvcAPI (入门 3)(源码)

    mvcAPI (入门 3)(源码) http://download.csdn.net/detail/chunfang740/9078579

  4. uafxcwd.lib(afxmem.obj) : error LNK2005 解决方法

    项目为非MFC,但要用到MFC的库,使用过程中遇到的问题总结一下 uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl opera ...

  5. Linux 性能监测:介绍

    看了某某教程.读了某某手册,按照要求改改某某设置.系统设定.内核参数就认为做到系统优化的想法很傻很天真:)系统优化是一项复杂.繁琐.长期的 工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采 ...

  6. HTML系列(HTMl+CSS+JavaScript+Jquery)--un

    HTML 指超文本标签语言. 点击查看更详细的HTML内容 包括:一.基本标签;二.常用标签;三.表单<form></form>;四.表格<table></t ...

  7. Sql合并两个select查询

    现有2个查询,需要将每个查询的结果合并起来(注意不是合并结果集,因此不能使用union),可以将每个查询的结果作为临时表,然后再从临时表中select所需的列,示例如下:   SELECT get.d ...

  8. shell脚本批量ping测试IP是否通

    #!/bin/bash rm -f result.txt cat ip.txt | fping > result.txt 2行代码就搞定,很方便,初学shell,很强大,问了下同事,但是shel ...

  9. Ubuntu升级没有声音的解决方法

    自从安装U14.04LTS版本后,每次开机都会弹出update窗,以前因为网络速度慢没更新成功过,这回环境允许就尝试了下这个过程,很顺利,可更新后没声音了,找了N中方法来解决,像更改配置文件/etc/ ...

  10. 复制选中的listbox内容

    private void lt_log_MouseClick(object sender, MouseEventArgs e) { Clipboard.SetDataObject(lt_log.Sel ...