fragment实现页面跳转 中能实现九宫格吗?

建立Android项目中的 fragment layout name 有什么用处?_百度知道fragment 与fragment 之间可以共用handler 吗?怎么实现?
[问题点数:100分,结帖人ink_s]
fragment 与fragment 之间可以共用handler 吗?怎么实现?
[问题点数:100分,结帖人ink_s]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年9月 移动开发大版内专家分月排行榜第二2015年6月 移动开发大版内专家分月排行榜第二2014年12月 移动开发大版内专家分月排行榜第二2014年7月 移动开发大版内专家分月排行榜第二2013年12月 移动开发大版内专家分月排行榜第二2013年11月 移动开发大版内专家分月排行榜第二2013年10月 移动开发大版内专家分月排行榜第二
2014年11月 移动开发大版内专家分月排行榜第三2014年2月 移动开发大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。fragment 中能实现九宫格吗?_百度知道现在主流的APP都会使用到Fragment,相信你也一定使用过,今天为大家介绍一下我曾经踏过的一个关于Fragment的坑。
以前做过的一个项目,Fragment嵌套高德地图,当再次进入Fragment的时候,会出现奇怪的现象。嵌套的地图会出现滑动不动的情况,起先还以为是高德的bug呢,经过一番研究,终确定这是一个坑。
先对Fragment做一个简单的介绍,借用csdn上朋友写的一段内容。&
Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计。平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互。Fragment允许这样的一种设计,而不需要你亲自来管理 viewhierarchy的复杂变化。 通过将activity的布局分散到fragment中, 你可以在运行时修改activity的外观,并在由activity管理的back stack中保存那些变化。
使用过Fragment的同学都知道,它的使用相当的简单,基本上和Activity中一样,就是生命周期函数稍稍多了点。今天不是介绍Fragment如何使用,而是介绍一个Fragment中的一个坑。现在相当多的APP都有以下三种设计风格。
一、底部TAB,一般3-5个,点击某个TAB,上面页面也随之切换,如QQ、腾讯微博、新浪微博。早期的时候Android开发者们都会使用TabActivity去实现,但是TabActivity存在一些问题,也不符合Andoid的单窗口设计的原则,所以已经被废弃,不推荐大家继续使用。如有业务需求,请优先考虑使用Fragement。
二、顶部TAB,一般也是3-5个左右,相对于底部TAB风格,顶部TAB一般会引入ViewPager + Fragment的实现方式,这样可以做到左右切换,如微信。
三、侧边TAB,也就是SlidingMenu + Fragment或者MenuDrawer + Fragment。这种风格自去年起,风靡的一发不可收拾,前段时间干货分享讲的一期就是这个,代码也开源在了Github上,有兴趣的朋友可以下载了解下。出门右转,查看历史消息《》。
上述三种风格中使用到的Fragment,一般很容易会被大家忽略了一个问题。那就是当和Fragment关联的view hierarchy正在被移除时,不会执行onDestroy()方法,而是会调用onDestroyView()。比如上述的风格二ViewPager + Fragment,默认情况下当ViewPager滑动到第三页的时候,第一页的Fragment就会执行onDestroyView,当再次滑动到第二页的时候,第一页的Fragment的onCreateView又会重新执行绘制页面。伴随而来的问题就是成员变量要重新赋值一次,辛苦耗时加载出来的页面又要重新加载一次,这样也就给内存增加了无意思的压力,用户体验上也不大友好,尤其在有网络请求等开销时长比较长的情况下。
那有没有上面解决办法呢?答案是肯定的。onDestroyView的执行和Activity的onDestroy不一样,不会销毁当前的页面,所以Fragment的所有成员变量的引用都还在。那就好办了,我们在onCreateView的时候,先判断该取到的数据是否为空,比如Fragment的根视图rootView,网络请求获取到的数据等,如果不为空就不用再次执行。这样一来也就避免了上述说的那些问题的存在了。
但是需要注意的一点就是,如果重用rootView的话,一定要记得在onDestroyView里面把rootView先给移除掉,因为已经有过父布局的View是不能再次添加到另一个新的父布局上面的。代码如下
这样也就解决了最前面我遇到的那个bug,由于每次进入都会创建一个MapView,很多地图叠在了一起,所以就出现了"滑不动"的奇怪现象。
今天分享的只是一个优化策略罢了,希望能帮助到你。
如果觉得对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享(ID:android_share)。下面是微信的二维码,为你提供及时高质的Android干货。技术交流QQ群:,欢迎大家加群,共同探讨下Android和Java技术,一起壮大我们的微信干货分享社区。
不会移除掉,必须手动操作
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区Android使用Fragment嵌套Fragment的方式实现界面滑动// 主Activitypublic class HomeActivity extends FragmentActivity implements OnClickListener {&&& private TextView footerL&&& private TextView footerM&&& private TextView footerR&&& private C&&& private FragmentManager fragmentM&&& @Override&&& protected void onCreate(Bundle savedInstanceState) {&&&&&&& super.onCreate(savedInstanceState);&&&&&&& setContentView(R.layout.home_activity);&&&&&&& initArgs();&&&&&&& getView2Init();&&&&&&& initFragment(new Fragment1());&&& }&&& /**&&&& * 初始化变量&&&& */&&& private void initArgs() {&&&&&&& context = HomeActivity.&&&&&&& fragmentManager = getSupportFragmentManager();&&& }&&& /**&&&& * 获得布局文件上的控件并初始化&&&& */&&& private void getView2Init() {&&&&&&& // 获得控件View&&&&&&& footerLeft = (TextView) findViewById(R.id.tv_footer_left);&&&&&&& footerMiddle = (TextView) findViewById(R.id.tv_footer_middle);&&&&&&& footerRight = (TextView) findViewById(R.id.tv_footer_right);&&&&&&& // 初始化控件View&&&&&&& footerLeft.setOnClickListener(this);&&&&&&& footerMiddle.setOnClickListener(this);&&&&&&& footerRight.setOnClickListener(this);&&& }&&& @Override&&& public void onClick(View v) {&&&&&&& // 当footer中的三个文本控件被点击时,作出回应&&&&&&& if (v == footerLeft) {&&&&&&&&&&& Toast.makeText(context, "点击了底栏left左边按钮", Toast.LENGTH_SHORT).show();&&&&&&&&&&& updateFragment(new Fragment1(), false);&&&&&&& } else if (v == footerMiddle) {&&&&&&&&&&& Toast.makeText(context, "点击了底栏middle中间按钮", Toast.LENGTH_SHORT).show();&&&&&&&&&&& updateFragment(new Fragment2(), false);&&&&&&& } else if (v == footerRight) {&&&&&&&&&&& Toast.makeText(context, "点击了底栏Right右边按钮", Toast.LENGTH_SHORT).show();&&&&&&&&&&& updateFragment(new Fragment3(), false);&&&&&&& }&&& }&&& /**&&&& * 初始化Fragment&&&& *&&&&& *
f&&&& */&&& private void initFragment(Fragment f) {&&&&&&& updateFragment(f, true);&&& }&&& /**&&&& * 更新Fragment&&&& *&&&&& *
isInit&&&& */&&& private void updateFragment(Fragment f, boolean isInit) {&&&&&&& FragmentTransaction ft = fragmentManager.beginTransaction();&&&&&&& ft.replace(R.id.content, f);&&&&&&& ft.commit();&&& }}// 用来实现切换的Adapterpublic class MyPagerAdapter1 extends FragmentStatePagerAdapter {&&& protected static final String[] SUB_FRAGMENT = new String[] { "Fragment1_1", "Fragment1_2",&&&&&&&&&&& "Fragment1_3" }; // 对应于每个大Fragment的小Fragment&&& private int mCount = SUB_FRAGMENT.&&& public MyPagerAdapter1(FragmentManager fm) {&&&&&&& super(fm);&&& }&&& @Override&&& public Fragment getItem(int position) {&&&&&&& if (0 == position) {&&&&&&&&&&& return new Fragment1_1();&&&&&&& } else if (1 == position) {&&&&&&&&&&& return new Fragment1_2();&&&&&&& } else if (2 == position) {&&&&&&&&&&& return new Fragment1_3();&&&&&&& } else {&&&&&&&&&&& System.out.println("创建子Fragment1_" + position + "失败");&&&&&&&&&&&&&&&&&& }&&& }&&& @Override&&& public int getCount() {&&&&&&& return mC&&& }&&& @Override&&& public CharSequence getPageTitle(int position) {&&&&&&& return SUB_FRAGMENT[position % mCount];&&& }}// 主Activity下有三个一级Fragment,这是其中之一public class Fragment1 extends Fragment {&&& private MyPagerAdapter1 mA&&& private ViewPager mP&&& private TitlePageIndicator mI&&& private static int mCurrentSubFragmentSeq = 0;&&& @Override&&& public void onCreate(Bundle savedInstanceState) {&&&&&&& super.onCreate(savedInstanceState);&&&&&&& setRetainInstance(true);&&& }&&& @Override&&& public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {&&&&&&& View v = inflater.inflate(R.layout.fragment1, container, false);&&&&&&& System.out.println("F1:onCreateView");&&&&&&& mAdapter = new MyPagerAdapter1(getFragmentManager());&&&&&&& mPager = (ViewPager) v.findViewById(R.id.pager);&&&&&&& mPager.setAdapter(mAdapter);&&&&&&& mIndicator = (TitlePageIndicator) v.findViewById(R.id.titles);&&&&&&& mIndicator.setViewPager(mPager, mCurrentSubFragmentSeq);&&&&&&& System.out.println("2、mCurrent Sub Fragment Sequence: " + mCurrentSubFragmentSeq);&&&&&&& mIndicator.setFooterIndicatorStyle(IndicatorStyle.Triangle);&&&&&&& mIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {&&&&&&&&&&& @Override&&&&&&&&&&& public void onPageSelected(int position) {&&&&&&&&&&&&&&& System.out.println("Changed to page " + position);&&&&&&&&&&&&&&& mCurrentSubFragmentSeq =&&&&&&&&&&& }&&&&&&&&&&& @Override&&&&&&&&&&& public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {&&&&&&&&&&& }&&&&&&&&&&& @Override&&&&&&&&&&& public void onPageScrollStateChanged(int state) {&&&&&&&&&&& }&&&&&&& });&&&&&&&&&& }&&& @Override&&& public void onActivityCreated(Bundle savedInstanceState) {&&&&&&& super.onActivityCreated(savedInstanceState);&&& }}// 每个一级Framgment下面有三个二级Fragment,这是其中之一public class Fragment1_1 extends Fragment {&&& private static final String KEY_CONTENT = "Fragment1:Content";&&& private B&&& @Override&&& public void onCreate(Bundle savedInstanceState) {&&&&&&& super.onCreate(savedInstanceState);&&&&&&& if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) {&&&&&&&&&&& bundle = savedInstanceState.getBundle(KEY_CONTENT);&&&&&&& }&&& }&&& @Override&&& public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {&&&&&&& View v = inflater.inflate(R.layout.fragment1_1, container, false);&&&&&&&&&& }&&& @Override&&& public void onSaveInstanceState(Bundle outState) {&&&&&&& super.onSaveInstanceState(outState);&&&&&&& outState.putBundle(KEY_CONTENT, bundle);&&& }}
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区

我要回帖

更多关于 fragment实现页面切换 的文章

 

随机推荐