当前位置: 代码迷 >> Android >> Android Fragment 切换多个界面 重叠有关问题 隐藏有关问题
  详细解决方案

Android Fragment 切换多个界面 重叠有关问题 隐藏有关问题

热度:557   发布时间:2016-04-27 23:46:50.0
Android Fragment 切换多个界面 重叠问题 隐藏问题

      接上一篇的博文:Android fragment 切换加载数据卡顿问题,想到的办法就是把切换之前的fragmenthide隐藏起来,就可以解决卡顿的问题,不用重新new一个fragment。由于左侧悬浮菜单有差不多10多个菜单,如果每一个菜单切换的时候,都要隐藏其余所有的菜单,那就会导致代码十分的臃肿,以前隐藏的代码是这样的:

				/*if (!openPositionFragment.isAdded()) { // 先判断是否被add过					transaction.hide(priceFragment)							.add(R.id.fragment_container, openPositionFragment)							.commit(); // 隐藏当前的fragment,add下一个到Activity中					titleView.setText(openPositionFragment.getFragmentTitle());				} else {					transaction.hide(priceFragment).show(openPositionFragment)							.commit(); // 隐藏当前的fragment,显示下一个					titleView.setText(openPositionFragment.getFragmentTitle());				}*/

    每一个菜单按钮下的点击事件,都要写一段这样的代码,而且局限是只能隐藏一个,导致切换的时候有重叠问题,无法正确显示。

   解决的方案是:

         先隐藏所有的fragment,然后进入点击事件,如果该fragment已经实例化,那就show就好,如果没有还未实例化,那就先new一个,然后show,最后一定记得commit,我就是由于没写这句代码导致空指针异常。还有一点注意的是必须先实例化你第一个进入的fragment。修改之后的代码如下:

private void initOpenMenuItem(View popupWindow_view) {		DrawableCenterTextView menu_price = (DrawableCenterTextView) popupWindow_view				.findViewById(R.id.menu_price);		menu_price.setOnClickListener(new OnClickListener() {			FragmentTransaction transaction;			@Override			public void onClick(View v) {				progressDialog.show();								transaction = manager.beginTransaction();				hideFragments(transaction);				/*				 * qiulinhe:2015年7月21日10:54:51 解决切换卡顿的问题				 */				if (priceFragment == null) {  	                // 如果MessageFragment为空,则创建一个并添加到界面上  					priceFragment = new PriceFragment();  	                transaction.add(R.id.fragment_container, priceFragment);  	                titleView.setText(priceFragment.getFragmentTitle());	            } else {  	                // 如果MessageFragment不为空,则直接将它显示出来  	                transaction.show(priceFragment); 	                titleView.setText(priceFragment.getFragmentTitle());	            }				transaction.commit();				popupWindow.dismiss();				progressDialog.dismiss();			}		});	}	/**      * 将所有的Fragment都置为隐藏状态。      *       * @param transaction      *            用于对Fragment执行操作的事务      */      private void hideFragments(FragmentTransaction transaction) {      	        if (priceFragment != null) {              transaction.hide(priceFragment);          }          if (openPositionFragment != null) {              transaction.hide(openPositionFragment);          }          if (closeHisFragment != null) {              transaction.hide(closeHisFragment);          }          if (orderHisFragment != null) {              transaction.hide(orderHisFragment);          }      }  
      这样就可以解决fragment切换重叠,无法正常显示的问题。不过这里提一个问题,就是hide方法执行之后,被隐藏的fragment,如果后台在获取数据,刷新界面,是否会导致数据太多,程序崩溃的问题?

        经过后台打印的时候,的确显示的当前fragment更新数据,但那些隐藏的fragment仍然在后台运行,这势必导致内存越来越被占用。

   如何解决?



版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案