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

Android编程使用Fragment界面向下跳转并一级级返回的实现方法

程序员文章站 2023-11-28 21:44:16
本文实例讲述了android编程使用fragment界面向下跳转并一级级返回的实现方法。分享给大家供大家参考,具体如下: 1.首先贴上项目结构图: 2.先添加一个接...

本文实例讲述了android编程使用fragment界面向下跳转并一级级返回的实现方法。分享给大家供大家参考,具体如下:

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

Android编程使用Fragment界面向下跳转并一级级返回的实现方法

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>

7.最后奉上实例链接:

完整实例代码代码点击此处本站下载

希望本文所述对大家android程序设计有所帮助。