王学岗Fragment(五)
2016-01-31 14:30
232 查看
上次我们写的代码还有一个缺点,就是我们在点击返回键的时候是直接退出,而不是返回上一个view.我们可以使用栈,把fragment放到会退栈当中。
修改MyMenuFragment类中的 onItemClick()方法。
但是你会发现每次回退都打印多个信息。
这是因为我们每次点击的时候都会为我们的fragment绑定一个监听,点击了三次我们就绑定了三个。现在修改如下,我们的监听机制不写在onItemClick()方法中,而写在onCreate()中,因为ListFragment只创建一次,所以onCreate()只执行一次,在该方法里只为他添加一个回退栈
修改 MyMenuFragment如下:
修改MyMenuFragment类中的 onItemClick()方法。
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final FragmentManager manager=getActivity().getSupportFragmentManager(); MyContentFragment old=(MyContentFragment) manager.findFragmentByTag("fragment"+position); //怎么知道要退到哪个地方呢?那就要添加一个回退栈的事件监听器 manager.addOnBackStackChangedListener(new OnBackStackChangedListener() { @Override public void onBackStackChanged() { //得到回退栈的数量 int count =manager.getBackStackEntryCount(); for(int i=0;i<count;i++){ Log.i("zhangxin", manager.getBackStackEntryAt(i).getName()); } } }); if(old==null){ MyContentFragment fragment=MyContentFragment.getInstance(position); FragmentTransaction transaction=manager.beginTransaction(); transaction.add(R.id.fl_content,fragment, "fragment"+position); checkOldFragments(position, manager, transaction); //把当前的fragment放入会退栈,并取名字为"fragment"+position。 transaction.addToBackStack("fragment"+position); transaction.commit(); }else{ FragmentTransaction transaction2=manager.beginTransaction(); checkOldFragments(position, manager, transaction2); transaction2.commit(); } }
但是你会发现每次回退都打印多个信息。
这是因为我们每次点击的时候都会为我们的fragment绑定一个监听,点击了三次我们就绑定了三个。现在修改如下,我们的监听机制不写在onItemClick()方法中,而写在onCreate()中,因为ListFragment只创建一次,所以onCreate()只执行一次,在该方法里只为他添加一个回退栈
修改 MyMenuFragment如下:
package com.tz.katefragement_repalce; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager.OnBackStackChangedListener; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.ListFragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView.FindListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; // ListFragment :Fragment+ListView //ontach---oncreat---onCreatView--onActivityCreate public class MyMenuFragment extends ListFragment implements OnItemClickListener { String[] days = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", }; private FragmentManager manager; @Override public void onActivityCreated(Bundle savedInstanceState) { ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, days); this.setListAdapter(adapter); getListView().setOnItemClickListener(this); super.onActivityCreated(savedInstanceState); } @Override public void onCreate(Bundle savedInstanceState) { manager = getActivity().getSupportFragmentManager(); // 怎么知道要退到哪个地方呢?那就要添加一个回退栈的事件监听器 // 因为ListFragment只创建一次,所以onCreate()只执行一次,在该方法里只为他添加一个回退栈 manager.addOnBackStackChangedListener(new OnBackStackChangedListener() { @Override public void onBackStackChanged() { // 得到回退栈的数量 int count = manager.getBackStackEntryCount(); for (int i = 0; i < count; i++) { Log.i("zhangxin", manager.getBackStackEntryAt(i).getName()); } } }); super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { MyContentFragment old = (MyContentFragment) manager .findFragmentByTag("fragment" + position); if (old == null) { MyContentFragment fragment = MyContentFragment .getInstance(position); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(R.id.fl_content, fragment, "fragment" + position); checkOldFragments(position, manager, transaction); // 把当前的fragment放入会退栈,并取名字为"fragment"+position。 transaction.addToBackStack("fragment" + position); transaction.commit(); } else { FragmentTransaction transaction2 = manager.beginTransaction(); checkOldFragments(position, manager, transaction2); transaction2.commit(); } } private void checkOldFragments(int position, FragmentManager manager, FragmentTransaction transaction2) { for (int i = 0; i < days.length; i++) { MyContentFragment mcf2 = (MyContentFragment) manager .findFragmentByTag("fragment" + i); if (mcf2 != null) { if (i == position) { transaction2.show(mcf2); } else { transaction2.hide(mcf2); } } } } }
相关文章推荐
- C++基于栈实现铁轨问题
- C语言栈的表示与实现实例详解
- C语言实现颠倒栈的方法
- 算法系列15天速成 第十天 栈
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- Array栈方法和队列方法的特点说明
- java数据结构之java实现栈
- 浅析栈区和堆区内存分配的区别
- 用Java代码实现栈数据结构的基本方法归纳
- 用PHP解决的一个栈的面试题
- 浅谈C#中堆和栈的区别(附上图解)
- JavaScript数据结构与算法之栈详解
- C语言之栈和堆(Stack && Heap)的优缺点及其使用区别
- Python实现栈的方法
- JavaScript数据结构与算法之栈与队列
- Java中堆和栈的区别详解
- 详解Java的堆内存与栈内存的存储机制
- java中堆和栈的区别分析
- C/C++函数调用栈的实现方法
- C++中静态存储区与栈以及堆的区别详解