Fragment栈回退和传参方式
来源:互联网 发布:adobe flash play mac 编辑:程序博客网 时间:2024/05/16 08:10
1.返回栈
当你需要点击返回键是返回上一个Fragment而不是直接退出Activity时,需要把之前的fragment加入返回栈。
ft.addToBackStack(null),然后重写退出键的方法。(public boolean onKeyDown(int keyCode, KeyEvent event))
具体的解释点击打开链接
2.AVD横竖屏切换
我们都知道让AVD在横竖屏切换的时候,当前Activity中的fragment都会通过Fragment.instantiate重新生成,该方法将使用默认的构造函数来生成相应的Fragment。因此,使用
public PopFragment(String titleString) {this.titleString = titleString;}该方法来传参,然后new一个对象是不安全的。
可以通过getArguments获得之前设置的数据,其原理是在FragmentActivity切换时会调用onRetainNonConfigurationInstance方法将FragmentManager中管理的所有Fragment其状态数据(其中就包括了这个设置的Bundle)保存在一个FragmentActivity.NonConfigurationInstances对象实例中,这样在新的FragmentActivity启动时在onCreate方法中可以使用Activity.getLastNonConfigurationInstance()方法来获取这个对象,然后通过FragmentManager.restoreAllState方法还原所有Fragment及其状态,需要注意的是在这种情况下可能会出现之前的Fragment没有detach而处于活动状态导致该Fragment的视图生成,可能会造成两个Fragment视图重叠的情况,在官方的Support.v4的例子FragmentTabs.TabManager.addTab里有一段检查Fragment是否detach的代码正是用于解决这个问题。
具体代码我把它贴出来
PopActivity.java
public class PopActivity extends Activity{private Button one, two; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pop); one = (Button)findViewById(R.id.button1); two = (Button)findViewById(R.id.button2); one.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {PopFragment p1 = PopFragment.getInstance("one");FragmentTransaction ft = getFragmentManager().beginTransaction();ft.replace(R.id.content, p1);ft.addToBackStack(null);////////////ft.commit();} }); two.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {PopFragment p1 = PopFragment.getInstance("two");FragmentTransaction ft = getFragmentManager().beginTransaction();ft.replace(R.id.content, p1);ft.addToBackStack(null);///////////////////////////ft.commit();} }); }@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {//实现回退 if (keyCode == KeyEvent.KEYCODE_BACK) { if(getFragmentManager().getBackStackEntryCount() == 0){ finish(); }else{ getFragmentManager().popBackStack();// 返回上一个fragment } } return super.onKeyDown(keyCode, event); }}对应的pop布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout 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" tools:context=".MainActivity" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="one" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="two" /> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout></LinearLayout>PopFragment.java
public class PopFragment extends Fragment {public static PopFragment getInstance(String title){//安全的传参方式PopFragment popFragment = new PopFragment();Bundle bundle = new Bundle();bundle.putString("title", title);popFragment.setArguments(bundle);return popFragment;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stubView view = inflater.inflate(R.layout.pop_test, container, false);TextView tView = (TextView)view.findViewById(R.id.textView1);tView.setText(getArguments().getString("title"));return view;}}对应的pop_test布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout 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" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
- Fragment栈回退和传参方式
- Fragment解析创建和传参,动态添加fragment
- Android Fragment和Activity之间通信方式
- activity和fragment的交互方式
- Activity和fragment传递数据的方式
- Fragment和Activity之间的传参
- Fragment构造函数和传参
- Fragment之间通过Activity相互传值和调用的2个方式
- Fragment传值的两种方式
- Activity和Fragment传递数据的两种方式
- 【Android基础知识】Fragment设计哲学和加载方式
- Fragment和Activity之间通过广播的方式传递数据
- Activity和Activity、Fragment之间传递数据的方式
- Activity和Fragment传递数据的两种方式
- (转)Activity和Fragment传递数据的两种方式
- Activity和Fragment传递数据的两种方式
- Fragment和Activity通信以及Fragment之间通信的两种方式
- Activity和Fragment的五种交互方式(Activity可以改变Fragment的UI,Fragment也可以改变ActivityUI)
- 概要设计怎么写?全面而具体的描述
- CSS修改前端的一些样式等,持续更新...
- 重定义和inline
- Java 重写(Override)与重载(Overload)
- 代理、通知和KVO三者的通信优缺点
- Fragment栈回退和传参方式
- Linux常用命令大全
- netfilter/iptables全攻略
- 第四届_错误票据
- java事件监听机制(观察者设计模式的实际运用)
- android动态换肤系列4——从apk文件中获取Resources对象(下)
- jQuery--引入jq&jq简单方法
- select()函数
- c#中的报表简单操作(Excel)