2012-10-27 78 views
4

初始狀態:預載所有片段的視圖?

您好,我目前正在更新現有應用程式,並與一個特定活動的問題。它包含7個選項卡,在這些選項卡中有不同方法的幾個圖像按鈕和文字瀏覽。

在應用程序的原始版本中,我使用了一個tabhost,並且基本上擁有一個xml文件和一個java文件所需的所有內容,但是無法將tabcontent橫向滑動以更改制表符,因此我創建了整個事情再次與片段。

挑戰:

在動作條,我有一個過濾器按鈕,是應該隱藏所有標籤中的某些textviews和imagebuttons,通過檢查標誌,然後調用所有的7種片段類的方法,然後在其rootView中將視圖設置爲GONE並且如果再次切換到VISIBLE。

問題:

這個動作條按鈕做工精細,如果用戶翻閱所有的標籤,但是,如果在應用程序的冷啓動點擊,它會崩潰的應用程序與空指針異常。 我懷疑這是因爲還沒有加載所有片段。

問:

我應該預裝的所有片段在活動的開始? 如果是這樣,我將如何做,並在什麼文件將完成? 有沒有另一種可能更好的方法來確保我可以操作ActionBar中的所有標籤/片段,即使我不知道,之前已經打開了哪些片段? 我應該將所有這些方法混合在一個全局方法中嗎?它會去哪個文件?

目前,它只適用於,如果您先滾動所有標籤,然後我可以根據需要經常切換過濾器。

代碼:

這被稱爲在活動等級:

public void toggleintroonly() { 
    MenuItem toggle = menu.findItem(R.id.mtoggle); 

    if (visible == 1) { 
     Fragments1.toggleintroonly(); 
     Fragments2.toggleintroonly(); 
     Fragments3.toggleintroonly(); 
     Fragments4.toggleintroonly(); 
     Fragments5.toggleintroonly(); 
     Fragments6.toggleintroonly(); 
     Fragments7.toggleintroonly(); 
     toggle.setTitle(getString(R.string.menu4toggled)); 
     toggle.setIcon(R.drawable.ic_action_showall); 
     visible = 0; 
    } else { 
     Fragments1.showall(); 
     Fragments2.showall(); 
     Fragments3.showall(); 
     Fragments4.showall(); 
     Fragments5.showall(); 
     Fragments6.showall(); 
     Fragments7.showall(); 
     toggle.setTitle(getString(R.string.menu4)); 
     toggle.setIcon(R.drawable.ic_action_filter); 
     visible = 1; 
    } 
} 

這是從Fragments1.toggleintroonly()的樣品:

public static void toggleintroonly() { 
    rootView.findViewById(R.id.tv1x02).setVisibility(View.GONE); 
    rootView.findViewById(R.id.bplay1x02).setVisibility(View.GONE); 
    rootView.findViewById(R.id.bshare1x02).setVisibility(View.GONE); 
    rootView.findViewById(R.id.binfo1x02).setVisibility(View.GONE); 
    rootView.findViewById(R.id.bring1x02).setVisibility(View.GONE); 
} 

以下是錯誤時點擊ActionBar中的過濾按鈕,在活動啓動後:

10-27 16:43:34.923: E/MediaPlayer(16946): mOnCompletionListener is null. Failed to send MEDIA_PLAYBACK_COMPLETE message. 
10-27 16:43:49.433: D/AndroidRuntime(16946): Shutting down VM 
10-27 16:43:49.433: W/dalvikvm(16946): threadid=1: thread exiting with uncaught exception (group=0x40c511f8) 
10-27 16:43:49.448: E/AndroidRuntime(16946): FATAL EXCEPTION: main 
10-27 16:43:49.448: E/AndroidRuntime(16946): java.lang.NullPointerException 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.cheftony.psychsoundboard.Fragments3.toggleintroonly(Fragments3.java:225) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.cheftony.psychsoundboard.NicknamesNew.toggleintroonly(NicknamesNew.java:121) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.cheftony.psychsoundboard.NicknamesNew.onOptionsItemSelected(NicknamesNew.java:90) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.app.Activity.onMenuItemSelected(Activity.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:353) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.view.View.performClick(View.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.view.View$PerformClick.run(View.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.os.Handler.handleCallback(Handler.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.os.Handler.dispatchMessage(Handler.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.os.Looper.loop(Looper.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at android.app.ActivityThread.main(ActivityThread.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at java.lang.reflect.Method.invokeNative(Native Method) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at java.lang.reflect.Method.invoke(Method.java:511) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 
10-27 16:43:49.448: E/AndroidRuntime(16946): at dalvik.system.NativeStart.main(Native Method) 

該錯誤似乎是在Fragments3類中引起的,因爲活動開始時,Fragments1處於活動狀態,並且其直接鄰居Fragments2也被預加載。

+0

你能添加更多關於'NullPointerException'的信息嗎? –

+0

添加了logcat的錯誤 –

+1

感謝您花時間來構建/格式化您的問題:) –

回答

2

一對夫婦建議:

  1. 如果您正在使用7個標籤的工作,你可能會考慮使用ViewPager代替。這將有助於加快用戶體驗。:)

  2. 確保您的Fragment s不會假定Activity已被創建,直到onActivityCreated()被調用。這可能是你得到NullPointerException的原因。您可以將Fragment作爲獨立的UI組件。如果您的Fragment正在互相交互,您可能需要重新考慮您的設計,因爲這可能會使事情變得複雜。

  3. 除非您的Fragment需要很長時間才能創建/顯示,否則我不確定是否需要預加載Fragment。有7個選項卡,用戶可能不會使用全部Fragment,因此加載它們可能會造成浪費。預先選擇少數幾個也是沒有意義的,因爲你永遠無法知道用戶會選擇下一個選項卡。在我看來,最好的解決方案只是初始化一個新的Fragment,並在用戶點擊選項卡時用它填充選項卡的視圖。

+0

1.我使用這種類型的標籤進行快速導航,所以在頂部有幾個標籤可見,標籤欄可以滾動所以人們可以輕鬆地從標籤7跳到標籤1,而無需側滑內容:https://picasaweb.google.com/106842831832923664939/ScreenCaptures?authkey=Gv1sRgCK_8jJiFpd2BjgE#5804035513041487042 –

+0

2.和3.過濾器操作是通過操作欄中的按鈕進行調用,並且必須操作所有7個片段,而不是從一個片段內我想更改另一個片段的內容。 和4.因爲過濾器按鈕在整個活動中都可見,並且它的圖標從「過濾器」更改爲「全部顯示」,所以我認爲有意義的是,所有的選項卡都一次過濾,因爲一旦設置了過濾器,用戶期望,當他們改變標籤以在那裏找到過濾的內容。此行爲與應用程序的先前版本以及舊版操作系統的版本一致 –

+0

此活動僅在具有處理能力的設備上調用,只有ICS和果凍bean設備才能獲得此活動,甚至在即時加載的仿真程序上,所以在預加載片段時應該沒有問題,但我不知道該怎麼做。 –