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。修改之後的程式碼如下:
這樣就可以解決fragment切換重疊,無法正常顯示的問題。不過這裡提一個問題,就是hide方法執行之後,被隱藏的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更新資料,但那些隱藏的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】30多個Android 開發者工具
文中部分工具是收費的,但是絕大多數都是免費的。轉自:謝玉林的部落格園 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