浅谈Fragment

来源:互联网 发布:python3 socket编程 编辑:程序博客网 时间:2024/05/17 05:57

1.FragmentManager:

     FragmentManager能够实现管理activityfragment. 通过调用activitygetFragmentManager()取得它的实例.(FragmentActivity)(getSupportFragmentManager()---使用support -v4包下的fragment)

     FragmentManager可以做如下一些事情:

1、使用findFragmentById()(用于在activity layout中提供一个UI的fragment)或findFragmentByTag() (适用于有或没有UI的fragment)获取activity中存在的fragment)

2、将fragment从后台堆栈中弹出, 使用 popBackStack() (模拟用户按下BACK 命令).

3、使用addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener.




2.FragmentTransaction:

    FragmentTransactionfragment进行添加,移除,替换,以及执行其他动作。

从 FragmentManager 获得一个FragmentTransaction的实例 :

FragmentManager fragmentManager =getFragmentManager(); 

FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();

每一个事务都是同时要执行的一套变化.可以在一个给定的事务中设置你想执行的所有变化,使用诸如 add(), remove(), 和 replace().然后, 要给activity应用事务, 必须调用 commit().在调用commit()之前, 你可能想调用 addToBackStack(),将事务添加到一个fragment事务的back stack. 这个back stack由activity管理, 并允许用户通过按下 BACK 按键返回到前一个fragment状态.

 

举个例子, 这里是如何将一个fragment替换为另一个, 并在后台堆栈中保留之前的状态:

// Create new fragment andtransaction Fragment newFragment = new ExampleFragment(); FragmentTransaction transaction =getFragmentManager().beginTransaction();  //Replace whatever is in the fragment_container viewwith this fragment,  // and add the transaction to the backstack transaction.replace(R.id.fragment_container,newFragment);  transaction.addToBackStack(null); // Commit thetransaction  transaction.commit();

 

在 这个例子中, newFragment 替换了当前layout容器中的由R.id.fragment_container标识的fragment.通过调用 addToBackStack(), replace事务被保存到back stack, 因此用户可以回退事务,并通过按下BACK按键带回前一个fragment.

 

如果添加多个变化到事务(例如add()或remove())并调用addToBackStack(), 然后在你调用commit()之前的所有应用的变化会被作为一个单个事务添加到后台堆栈, BACK按键会将它们一起回退.

 

添加变化到 FragmentTransaction的顺序不重要, 除以下例外:

·        必须最后调用 commit().

·        如果添加多个fragment到同一个容器, 那么添加的顺序决定了它们在view hierarchy中显示的顺序.

当 执行一个移除fragment的事务时, 如果没有调用 addToBackStack(), 那么当事务提交后, 那个fragment会被销毁,并且用户不能导航回到它. 有鉴于此, 当移除一个fragment时,如果调用了 addToBackStack(), 那么fragment会被停止, 如果用户导航回来,它将会被恢复.(生命周期方法不会全部执行)

 

提示: 对于每一个fragment事务, 你可以应用一个事务动画, 通过在提交事务之前调用setTransition()实现.

 

调用 commit() 并不立即执行事务.恰恰相反, 它将事务安排排期, 一旦准备好, 就在activity的UI线程上运行(主线程).如果有必要, 无论如何, 你可以从你的UI线程调用executePendingTransactions() 来立即执行由commit()提交的事务. 但这么做通常不必要, 除非事务是其他线程中的job的一个从属.


重点: 1.如果不调用.addToBackStack(null)这个方法(把fragment加入栈中),那么每次调用fragment的时候fragment的生命周期方法都会执行,fragment的状态不会保存的。

2.当fragment已经调用add方法加入到栈中的时候再切换显示的时候 :

FragmentTransaction transaction = manager.beginTransaction();

transaction.show(photoFragment).commit();

 manager.popBackStack(0, 0);

3.当一个fragment已经加入到栈中的时候且现在正在显示的时候,要显示另一个fragment(第一次显示):

transaction = manager.beginTransaction();

transaction.hide(photoFragment).commit();

transaction = manager.beginTransaction();
transaction.add(R.id.body,browserFragment);  
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);

transaction.commit(); 



3.activity传递参数给fragment:

activity中设置参数给fragment:

browserFragment = new BrowserFragment();
        Bundle args = new Bundle();
        InfoSerializable infos = new InfoSerializable();
        infos.setList(list);
        args.putSerializable("infos", infos);
        //Log.i("hj", "position"+position);
        
        args.putInt("position", position);
        browserFragment.setArguments(args);

fragment   onActivityCreated 方法中接收参数:

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        viewPager = (ViewPager) getView().findViewById(R.id.pager);
        Bundle args = getArguments();
        InfoSerializable infos = (InfoSerializable) args.getSerializable("infos");
        listinfos  = infos.getList();
         position = args.getInt("position");


}




4.viewpager+fragment:

1.activity继承FragmentActivity

IAskFragmentAdapter fragmentAdapter = new IAskFragmentAdapter(getSupportFragmentManager());
        pager.setAdapter(fragmentAdapter);
        pager.setOnPageChangeListener(changeListener);

2.adapter继承 FragmentPagerAdapter:

public class IAskFragmentAdapter extends FragmentPagerAdapter {

    public IAskFragmentAdapter(FragmentManager fm) {
        super(fm);
    }
    /**
     * 向外返回当前要显示的fragment
     */
    @Override
    public Fragment getItem(int position) {
        Fragment f = null;
        if (position == 0) {
            f = new IAskFragment();
        } else if (position == 1) {
            f = new IAskAnswerFragment();
        } else if (position == 2) {
            f = new IAskPersonFragment();
        }
        
        return f;
    }

    /**
     * 返回一共多少个数量
     */
    @Override
    public int getCount() {
        return 3;
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
    }
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        return super.instantiateItem(container, position);
    }




















0 0
原创粉丝点击