1

我有MainActivity,它開始DetailsActivityDetailsActivity佈局僅包含顯示DetailsFragment所需的一個FrameLayout避免在創建片段之前顯示活動佈局

因此,當用戶從MainActivity點擊按鈕,DetailsActivity開始:

public class DetailsActivity extends ActionBarActivity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_info); 
     displayFragment(); 
    } 

    public void displayFragment(){ 
     Fragment fragment = DetailsFragment.newInstance(); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.fragment_container, fragment); 
     transaction.commit(); 
    } 
} 

的問題是,以前DetailsActivityonCreate結束DetailsFragmentonCreateView,讓用戶看到了多毫秒空白活動佈局。有什麼辦法可以避免它?

+0

之前,你是怎麼知道的'DetailsActivity'完成? – 2015-04-01 06:44:39

+0

@MD你誤解了我,我的意思是'DetailsActivity'' onCreate'方法早些時候完成'DetailsFragment' onCreateView',所以活動佈局顯示在前面,比片段佈局被初始化。但是在活動佈局中,只有一個容器用於片段,因此用戶看到片刻的空白活動。 – mol 2015-04-01 07:40:57

回答

0

這實際上是我的錯誤。我在談論的延遲是由於我爲片段過渡添加了自定義幻燈片動畫。在創建活動的情況下,反向棧是空的,並且在顯示第一個分段佈局之前它會造成很小的延遲。所以我加了檢查:

if (fragmentManager.getBackStackEntryCount() != 0) 

調用

transaction.setCustomAnimations(R.anim.in_transition_left, R.anim.out_transition_left); 
0

根據你的問題,你必須做這樣你的onCreate內:

if (savedInstanceState == null) { 

       Fragment fragment = DetailsFragment.newInstance(); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.fragment_container, fragment); 
     transaction.commit(); 

     } 

而且如果這樣做之後,發生了誤差,那麼請告訴我們您的片段Java類。

+0

感謝您的回覆。我不明白它有什麼用處。問題是'DetailsActivity''onCreate'方法之前完成了'DetailsFragment' onCreateView',所以活動佈局顯示在前面,比片段佈局被初始化。但是在活動佈局中,只有一個容器用於片段,因此用戶看到片刻的空白活動。只有在活動啓動時纔會發生。如果我在創建活動後切換片段,則不會有任何延遲,因爲活動佈局已經創建。 – mol 2015-04-01 07:46:25

1

的問題是,DetailsActivity的onCreate完成之前 DetailsFragment onCreateView

,預計的,因爲從here

提交()時間表提交本次交易的。提交不會立即發生 ;它將被安排爲在主線程工作 要做的下一次線程準備

可不久後提交嘗試fragmentManager.executePendingTransactions()

檢查executePendingTransactions

+0

感謝您的回覆。我明白,這是預期的,我想知道是否有辦法避免它,也許是不同的設計或什麼。附: 'fragmentManager.executePendingTransactions()'沒有幫助。 – mol 2015-04-01 07:43:16

+0

@mol嘗試將片段放入「activity_info.xml」本身,而不是動態添加它。 – 2015-04-01 09:24:34

3

這是不可能的。

爲了顯示Fragment它必須放在容器中。在你的情況下,容器(R.id.fragment_container)是你的主佈局(R.layout.activity_info)的一部分。

必然地,爲了R.id.fragment_container可用以接受Fragment,R.layout.activity_info MUST一直在呼籲以下...

transaction.replace(R.id.fragment_container, fragment); 
transaction.commit(); 

不幸的是,之前充氣commiting一個FragmentTransaction的行爲是異步的,最重要的是,你不得不打電話......

setContentView(R.layout.activity_info); 

...爲了有一個有效的參考commiting在交易前到FrameLayout(通過R.id.fragment_container)。

Fragment變得可見的時間可能會因許多因素(設備功能,Fragment佈局和輔助代碼的複雜程度等)而異。它可能會搗鼓流程訂單,但是沒有官方的方式,結果可能會在不同的Android設備上或多或少地成功。

如果您真的擔心用戶短時間看到空白屏幕,那麼我建議您使用Activity創建一個ProgressDialog,並帶有一個簡單的「Please wait ...」消息 - 在創建對話框之前提交交易並在Fragment完全創建後解除該交易。

相關問題