1. 程式人生 > >Android Fragment 切換多個介面 重疊問題 隱藏問題

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仍然在後臺執行,這勢必導致記憶體越來越被佔用。

   如何解決?

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() {
			@Override
			public 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:?來資料時,更新
	 * @[email protected] 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());
				}
			}
		}
	}



相關推薦

Android Fragment 切換介面 重疊問題 隱藏問題

      接上一篇的博文:Android fragment 切換載入資料卡頓問題,想到的辦法就是把切換之前的fragmenthide隱藏起來,就可以解決卡頓的問題,不用重新new一個fragment。由於左側懸浮選單有差不多10多個選單,如果每一個選單切換的時候,都要隱

TabLayout+ViewPager+Fragment實現條目載入(介面

要求: 實現如圖所示效果,上方TabLayout,下面ViewPager+Fragment,下拉重新整理,上拉載入更多,多條目載入,顯示title標題,根據images圖片數量進行多條目載入。 介面如下,其中page為頁數,lid為上方標題的id https://feed.mix.s

android Fragment實現APP主介面Tab頁面切換和點選事件

Fragment 頁面切換不能滑動 所以對於listview 可以新增的左右滑動事件 ,不會有衝突例如(QQ的好友列表的刪除) Fragment 和viewpager 的區別 Viewpager 的事件都需要寫在 MainActivity 使

Android點選Button切換圖片顯示

最近在自學Android,編譯器用的是Android Studio,因為Eclipse + Android SDK + ADT配置了半天最後還報錯找不到dx.jar,關鍵這個包真實存在,實在受不了直接用AS來學了,但不得不說AS寫起來非常爽,咔咔咔 程式碼就出來了,但是。。

Android RxJava+Retrofit 一次(合併)請求介面

在實際開發中,我們需要同時請求2個或者2個以上的介面,同時又有更新UI,怎麼辦呢? 最直接的最暴力的方法就是直接在一個方法裡同步呼叫兩個介面,那使用RxJava怎麼實現呢? 這個問題可以使用RxJava的Merge操作符實現,故名思議就是將兩個介面Obser

Android Fragment 切換時佈局重疊

用Fragment模擬Tab頁面,正常情況不會發生切換時重疊問題,但是當應用在後臺執行時,設定更改語言選項或系統不小心強制關閉後,再進入應用會同時顯示多個Tab內容,UI發生重疊。 這是因為再次回到這個app的時候,通過onCreate中的引數savedInstanceSt

Android ViewPager實現圖片水平滾動

oncreate iss block 如果 del ner ide extends 大小 1.示意圖 2.實現分析 (1).xml配置 <!-- 配置container和pager的clipChildre

一個類extends 繼承介面的實現方法

在java中 一個類中不能繼承多個介面,但是可以通過一個介面繼承多個介面來實現。具體程式碼如下 public interface LanguageBeharvior { public void language(); } public interface SpeakBeharvior {

Android Studio 配置程式碼倉庫(maven)

收集了一些。方便copy使用。 repositories { mavenCentral() maven { url "https://jitpack.io" } maven { url "http://maven.aliyun.com/nexus/content/grou

java中介面是否可以繼承介面

以下內容轉自:http://blog.csdn.net/tiantiandjava/article/details/46514783 介面是常量值和方法定義的集合。介面是一種特殊的抽象類。 java類是單繼承的。classB Extends classA java介面可以多繼承。Inte

java類支援繼承麼?可以實現介面麼?

java 不支援多繼承,但類可以實現多個介面,間接的實現多繼承,也可以通過內部類。 參考程式碼:MultiExtendsTest // 測試間接的實現多繼承 public class MultiExtendsTest extends D implements A, B, C {

C#學習——簡單聊聊 QI(Query Interface 介面訪問)→一個類實現介面

內容目錄: 1,引言QI 2,例項 3,類與物件與介面之間的關係梳理 1,引言 在COM中,和我們打交道的是介面而不是類,那我們開發的時候要使用這些功能,就只能通過這些介面,通過介面提供的方法,COM是一種C / S架構(伺服器/客戶端),伺服器定義了操作的方法。客戶端則通過

介面BlockingQueue分析以及實現介面時的一點問題

在java併發包中,每種阻塞佇列BlockingQueue都有各自的特性,但是他們都是BlockingQueue的實現,因此分析併發包中的具體實現的BlockingQueue不如先了解BlockingQueue介面各方法的意義,然後具體分析某一個具體BlockingQueue佇列實現,最後推

Android Studio 中module引用同一個jar(或者衝突解決)解決方案

在Android開發過程中我們多多少少會引入module,不僅會提高專案的開發進度,而且專案管理起來相當方便。 但是同一個專案中引入多個module引入同一個jar或有衝突的jar時候在編譯的時候會出現錯誤,這些錯誤往往讓人抓狂。 在解決這些錯誤之前,讓我們先了解下關

mybatis 介面引數的註解使用方式(@Param)

1 簡介 1.1 單引數 在 Mybatis 中, 很多時候, 我們傳入介面的引數只有一個。 對應介面引數的型別有兩種, 一種是基本的引數型別, 一種是 JavaBean。 例如在根據主鍵獲取物件時, 我們只需要傳入一個主鍵的引數即可。 而在插入, 更新等操作時, 一般會涉及到很多引數, 我們就使用 Java

android fragment 切換時上下層檢視點選區域衝突

在使用fragment 動態add  或者replace fragment 後碰到過點選空白區域響應   add 或者replace 之前的 UI 或者fragment裡的點選事件 ,導致異常操作! 在android-support-v4 中FragmentPager

生成互不重疊的不同半徑圓

  生成多個互不重疊的不同半徑圓 https://www.zhihu.com/question/53012468   固定區域,生成所有圓,統計圓的面積,最後面積最大的就是答案。 import numpy as np from scipy.optimize

Android】30Android 開發者工具

文中部分工具是收費的,但是絕大多數都是免費的。轉自:謝玉林的部落格園 FlowUp 這是一個幫助你跟蹤app整體效能的工具,深入分析關鍵的效能資料如FPS, 記憶體, CPU, 磁碟, 等等。FlowUp根據使用者數量收費。 由Facebook開發的一個強大的

Java - 一個類實現的介面,有相同簽名的default方法會怎麼辦

Java - 一個類實現的多個介面,有相同簽名的default方法會怎麼辦 public interface A { default void hello() { System.out.println("Hello from A"); }

Android AlarmManager設定定時事件時只最後一個有效問題解決

最近用到了AlarmManager,遇到了問題,當我設定多個定時器時,發現只有一個起作用,百思不得其解,後來在網上找到了原因,把人家的解決辦法貼上: AlarmManager的常用方法有三個: (1)set(int type,long startTime,Pending