开发中尽量用fragment代替activity来完成跳转,那么如何用fragment来替换activity来替换呢???

来源:互联网 发布:odi 绿地 并购 数据 编辑:程序博客网 时间:2024/04/28 00:56

1、只有fragment使用butterknife的时候的butterknife.bind(this,view),其他的都是butterknife.bind(this),包括自定义控件的基础view或者是继承viewgroup。并且也只有fragment需要解绑。

绑定:Unbinder unbinder = ButterKnife.bind(this, view);

解绑:

@Override

public void onDestroyView() {

    super.onDestroyView();    unbinder.unbind();}
2、我们尽量开发一个app只用两个左右的activity,一个是一开始就存在的mainActivity,另外一个activity是当做一个容器,当点击mainActivity里面的任何点击事件需要跳转界面的时候都跳转到另外一个activity里面,然后在另外一个fragment里面(也就是另外一个activity里面)做你想做的任何操作。如果另外一个fragment里面也有跳转事件的话,就replace掉自己,但是仍然是在本身的这个容器activity里面,然后返回的时候就弹栈,最后一个返回到mainActivity的时候就不是弹栈了,是关闭这个容器activity,当mainActivity又有点击事件跳转界面的时候再开启。这样会节省喝多性能,流畅很多。你也可以对replace的fragment做一些进场和出场动画来满足自己的需求。
3、下面就是那个容器activiy
public class FragmentActivity extends AppCompatActivity {    private static FragmentManager fragmentManager;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_fragment);        Class<Fragment> fragmentClass = (Class<Fragment>) getIntent().getSerializableExtra("fragment");        Bundle bundle = getIntent().getExtras();        try {            Fragment fragment = (Fragment) fragmentClass.newInstance();            if (bundle != null) {                fragment.setArguments(bundle);            }            fragmentManager = getFragmentManager();            fragmentManager.beginTransaction()                    .replace(R.id.fragment_container, fragment)                    .commit();        } catch (Exception e) {            e.printStackTrace();        }    }    public static void startActivity(Context context, Class<? extends Fragment> fragment) {        startActivity(context, fragment, null);    }    public static void startActivity(Context context, Class<? extends Fragment> fragment, Bundle bundle) {        Intent intent = new Intent(context, FragmentActivity.class);        intent.putExtra("fragment", fragment);        if (bundle != null) {            intent.putExtras(bundle);        }        context.startActivity(intent);    }
}
4、从mainActivity跳转到容器activity方法:
FragmentActivity.startActivity(getActivity(), TestFragment.class);

5、如果是在容器activity里面的fragment需要执行其他跳转操作(不是跳转到mainActivity)的话就用进栈:
FragmentTransaction transaction = getFragmentManager().beginTransaction();   transaction.setCustomAnimations(      R.animator.slide_in_right, R.animator.slide_out_left,      R.a nimator.slide_in_right, R.animator.slide_out_left); transaction.replace(R.id.fragment_container, new TestFragment())                        .addToBackStack(null)                        .commit();
退出的话(不是退出到mainActivity)就实行弹栈:
getFragmentManager().popBackStack();
如果是退出到mainActivity的话就关闭这个容器activity:
getActivity().finish();
6、如果你想从一个fragment传递数据到另一个fragment的话就在进栈的时候,传递一个bundler进去,分两种情况:(1)是从mainActivity的fragment传递到容器的fragment,那么就需要在你启动容器Activity的时候传递一个bundler进去,也就是构造方法不一样而已,
FragmentActivity.startActivity(getActivity(), SettingFragment.class,bundle);
(2)如果是在容器activity里面fragment之间的数据传递的话,就把bundle直接设置到要启动的fragment里面去:
FragmentTransaction transaction = getFragmentManager().beginTransaction();Bundle bundle = new Bundle();bundle.putString("data","123");TestFragment testFragment= new TestFragment ();drawWithFragment.setArguments(bundle);transaction.replace(R.id.fragment_container, testFragment).addToBackStack(null).commit();

7.拿出从别的fragment传过来的值,在onCreate里面拿:
@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    Bundle bundle = getArguments();    String data = (String) bundle.get("data");}

8、为了代码的规范,在fragment的OnCrateView里面只进行butterknife的初始化和布局的初始化,像什么initData之类的操作都放在onViewCreate里面进行。不要问我为什么,,我上一家公司是这样要求的。。。

0 0
原创粉丝点击