1

我正在開發一個應用程序,將在工業設置中使用作爲手持式界面,分佈式和我的工作場所預先配置。我正在努力使應用程序作爲主頁啓動器運行,以便讓平板電腦「失蹤」的誘惑力降低。主頁啓動器問題與碎片重新啓動後

背景

我有我的表現,使應用程序啓動器中的以下內容:

<intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.HOME" /> 
    <category android:name="android.intent.category.DEFAULT"/> 
</intent-filter> 

(我可以發佈更多的清單,如果有必要的)

我的應用程序的結構如下:

  1. US B_Stuff延伸活動
  2. 主要延伸USB_Stuff
  3. 的UI擴展片段
  4. SQLiteHelper擴展SQLiteOpenHelper

「主」 處理所有的片段通信和交易的。 「Main」也是在名稱屬性<activity>下的清單中註冊的內容。

我也有一個BOOT_COMPLETED接收器在啓動我的應用程序的清單。

問題

解決現在一切都很正常,如果我從Eclipse運行程序,並使用它。但是,如果我重啓設備(在華碩Nexus 7(4.2.2)和三星Galaxy Tab 2 7.0(4.1.1)上進行測試),它會在第一個屏幕上啓動,其中包含ListView,如下所示:

First fragment to load

然後我可以選擇的項目形成的列表,它會帶我到包含在地方名單三個按鈕的下一個片段:

Second fragment

解決如果我點擊上面第二張圖片上的紅色框,那麼一旦停用「onClickListener」(?),我在紅色空間中觸摸後,我可以選擇一個不同的項目,形成ListView一次。雖然如果我點擊三個可見按鈕之一,應用程序將執行它的onClick方法,而不是點擊進入前一個屏幕。這種行爲在多個屏幕上繼續,並在應用程序到達TableLayouts時停止。

另一個我覺得可能會涉及的問題是,後退按鈕和後來取消按鈕應該彈出後棧到某些點根本不起作用或執行不正確的彈出位置。

UPDATE:下面執行我的解決方案後,我已經解決了大部分問題,但如果我開始前2秒內使用應用程序(約),那麼我還是結束了在彈出的隨機後退棧位置。

我想通了那麼遠,

如果我註釋掉主頁啓動intent-filter和使用BOOT_COMPLETED過濾器重新正常啓動的應用程序,那麼一切功能。

此外,我添加了日誌語句來查看整個程序中的後退棧條目數,並在應用程序正確運行時遵循相同的確切路徑,而且數字一致,但如果單擊紅色框,應用程序會將碎片添加到它不應該存在的後端堆棧中。這導致我相信這不是在後面堆棧上的額外項目可能泄漏他們的意見的問題。

解決編輯:我添加了一個按鈕,什麼都沒有做,這是在寬度和高度match_parent第二個片段,當我試圖通過點擊前面的片段的ListView,它沒有工作。看起來好像背景是「可點擊的」並且前一個片段被設置爲「背景/壁紙」(?)。

質詢

ANSWERED 1)什麼能在重新啓動後會從這些片段 「佈局泄漏」 到片段?

部分答案 2)什麼會導致背部/取消按鈕(popBackStack(...))重新啓動後不能正常工作?

根據要求可提供更多代碼以便於解決方案。

回答

1

問題1:因爲它似乎是佈局並沒有被完全刪除,我決定嘗試刪除所有的聽衆中的每個片段的onDestroy所有子項。我最終找到的方法removeAllViewsInLayout(),並決定嘗試下面的代碼:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     container.removeAllViewsInLayout(); 
     return inflater.inflate(R.layout.welcome_select_cabinet, container, false); 
    } 

此去到每一個片段,這樣的佈局被誇大爲佈局前的ViewGroup的子項將被清除。這解決了「點擊」到前一個片段的項目的問題。

問題2:我已經添加了以下setContentView()在我的「主要」活動後,立即:

getFragmentManager().popBackStack(); 

,然後當我在「主」的onCreate添加第一個片段,我改變了以下:

Welcome welcomeFragment = new Welcome(); 
getFragmentManager().beginTransaction().add(R.id.parent_container, welcomeFragment, "welcomeSelect").commit(); 

這樣:

WelcomeSelectCabinet welcomeSelection = new WelcomeSelectCabinet(); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.add(R.id.parent_container, welcomeSelection, "welcomeSelect"); 
transaction.addToBackStack(null); 
transaction.commit(); 

現在,如果我在重新啓動後等待約2秒,然後開始使用該應用程序,則不會遇到任何錯誤。但是,如果我立即使用該應用程序,則會出現與以前相同的錯誤,直到我再次重新啓動並等待2秒鐘。

編輯:我加入5第二負載屏幕以佔〜2秒「裝載」,並且似乎已經固定在的Nexus 7,但沒有問題的銀河標籤2.我改變了5秒到10秒,因爲Galaxy Tab 2似乎需要兩倍左右的時間啓動,這似乎解決了問題。

編輯:爲了使裝載更相容,我能夠將其扎入BOOT_COMPLETED接收機,並設置存儲在SharedPreferences一個布爾值,將確定哪些片段來加載基於該值,這是重置SHUTDOWN BroadcastReceiver。