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>





0 0
原创粉丝点击