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

来源:互联网 发布:联通网络ip地址丢失 编辑:程序博客网 时间:2024/05/20 01:11

      接上一篇的博文: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;@Overridepublic 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仍然在后台运行,这势必导致内存越来越被占用。

   如何解决?

2015年8月14日10:23:44:今天终于找到了解决方案:

    之前监听数据变化,是根据数据变化的监听器变化,发送了一个事件,fragment接收到了之后,重新绑定数据源,加载数据,更新listview列表项。我的处理方法很笨:定义了一个map,存放每个行的数据,当数据以来,我就map.removeall(map),然后重新加载整个列表项,一开始数据少,更新慢,不会影响长按操作,后期测试的时候,数据变化很快,就导致了长按按钮无法正常使用的问题。

     同事提供了一个很好的解决方案就是:判断数据源里的数据和现在展示出来的列表数据,哪些是发生了变化,这样只更新变化的几个字段,就不会导致重新加载之后,数据刷新太快,导致长按无法使用。

@Override
public void onTradeChanged(Long ticket) {
isHidden();
// 如果交易發生變化,則從新獲取開倉數據
System.out.println(ticket + " ===== ");
if (!isHidden()) {  //这个就是fragment就是判断当前fragment是否隐藏,如果已经隐藏了,就不在后台更新数据,不接受更新
onTradeDataChange(ticket);
}
}


=========================更新时间2016年2月26日11:00:25:增加如何更新map中的部分数据,避免先全部删除map的数据,代码如下:

// private void onTradeDataChange() {updateTableData();fireTableDataChange();}public void fireTableDataChange() {getHandler().post(new Runnable() {@Overridepublic void run() {// tableAdapter.notifyDataSetInvalidated();if (tableAdapter != null) {tableAdapter.notifyDataSetChanged();}}});}/** *  * @Title:?updateTableData * @Description:?数据發生變化 * @param? * @return?void * @throws?? */private void updateTableData() {dataMap.clear();TTrade[] tradeVec = getTradeVec();for (TTrade trade : tradeVec) {// if (!isExsitsTicketSplitno(trade)) {HashMap<String, Object> rowData = addTradeNode(trade);dataMap.add(rowData);// } else {// HashMap<String, Object> rowData = removeOpenPosition(trade);// if (rowData != null) {// dataMap.remove(rowData);// }// }}// 按照系统设置传递过来的数据进行排序sortOrderHisByAll(oppsortInt);}/** *  * @Title:?updateTableData * @Description:?来数据时,更新 * @param?@param instrumentName * @return?void * @throws?? */private void updateTableData(String instrumentName) {for (HashMap<String, Object> rowData : dataMap) {String instName = rowData.get(Instrument).toString();if (instrumentName.equalsIgnoreCase(instName)) {long ticket = Long.parseLong(rowData.get(Ticket).toString());TTrade trade = APIDoc.getUserDocCaptain().getTrade(ticket);if (trade != null) {rowData.put(FloatPL, trade.get_floatPL());rowData.put(MktPrice, trade.get_marketPrice());}}}}



38 27