Android编程使用Fragment界面向下跳转并一级级返回的实现方法
本文实例讲述了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>
7.最后奉上实例链接:
完整实例代码代码点击此处本站下载。
希望本文所述对大家android程序设计有所帮助。