接着上一篇項目的進度。上一篇講了怎樣利用fragment來實現下拉菜單。公用菜單,以實現切換主界面數據的功能,這時候遇到的問題是:使用了fragment的切換界面方法。但載入的數據太多。用戶從一個界面切換到這個界面的時候。至少有一兩秒的卡頓,這是沒法忍受的,代碼例如如下:java
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) { transaction = manager.beginTransaction(); transaction.replace(R.id.fragment_container, priceFragment); titleView.setText(priceFragment.getFragmentTitle()); transaction.commit(); popupWindow.dismiss(); } }); }上述代碼在切換fragment界面的時候,依據fragment的方法api,replace是要又一次生成實例的,這就勢必致使數據又一次載入,咱們必須得採取隱藏的方式或者加一個進度條來緩解。這裏我採用的是fragment提供的hide方法,來實現數據的高速顯示,改動代碼例如如下:
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) { transaction = manager.beginTransaction(); /* * qiulinhe:2015年7月21日10:54:51 * 解決切換卡頓的問題 */ if (!priceFragment.isAdded()) { // 先推斷是否被add過 transaction.hide(openPositionFragment).add(R.id.fragment_container, priceFragment).commit(); // 隱藏當前的fragment。add下一個到Activity中 titleView.setText(priceFragment.getFragmentTitle()); } else { transaction.hide(openPositionFragment).show(priceFragment).commit(); // 隱藏當前的fragment,顯示下一個 titleView.setText(priceFragment.getFragmentTitle()); }</span> popupWindow.dismiss(); } }); }原理就是:
翻看了Android官方Doc。和一些組件的源碼。發現,replace()這種方法僅僅是在上一個Fragment再也不需要時採用的簡便方法。api
正確的切換方式是add()。切換時hide()。add()還有一個Fragment。再次切換時,僅僅需hide()當前,show()還有一個。
這樣就能作到多個Fragment切換不又一次實例化:ide