2015-09-22 137 views
0

讓我們考慮,我有2 fragment a & bAndroid的片段沒有表現出先前的位置交易

片段包含視圖尋呼機,橫向網格視圖和按鈕圖像等與滾動。 當我點擊Fragment a中的一個項目時,它會轉到fragment b,當我點擊後退按鈕fragment b時,它會回到fragment a。所有的工作都很完美。

我的問題是在後面按了fragment b,它從開始加載fragment a。我想在交易開始的地方顯示fragment a(比如底部)的確切位置。

我正在做每個項目的適配器中的所有片段事務,代碼如下所示。

Bundle arguments = new Bundle(); 
Fragment fragment = null; 
MyClass cls= (MyClass) obj.get(position); 
arguments.putParcelable("single", offer); 
// Start a new fragment 
fragment = new DetailFragment(); 
fragment.setArguments(arguments); 
FragmentTransaction transaction = activity .getSupportFragmentManager().beginTransaction(); 
transaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 
transaction.replace(R.id.content_page_frame, fragment, OfferZoneDetailFragment.ARG_ITEM_ID); 
transaction.addToBackStack(DetailFragment.ARG_ITEM_ID); 
transaction.commit(); 

如何從其他片段回來時加載片段事務的開始位置。

+0

這取決於你想要顯示/保持位置的元素的確切類型,看看:http://stackoverflow.com/questions/15678489/best-way-save-restore-textview-position-in-scrollview&http://stackoverflow.com/questions/29208086/save-the-position-of-scrollview-when-the-orientation-changes &http://stackoverflow.com/questions/8619794/maintain-scroll-position-of-gridview-through-screen-rotation&http://stackoverflow.com/questions/3014089/maintain-save-restore-scroll-position當我返回一個列表視圖 –

+0

@MovsarBekaev我怎麼知道確切的類型位置?,所有的鏈接都提到了列表和網格,我問的是有5個網格和1個列表的片段 – Sree

+0

我修復了鏈接。你說你想要的是在切換片段時保存視圖區域的位置,對吧?如果是這樣,你需要處理片段中的元素,而不是片段本身,據我所知,你可以通過在Bundle或靜態變量或其他任何地方保存位置來切換,並在切換時調用一些恢復方法反之亦然.. –

回答

2

我明白你的問題。您可以使用

transaction.add(R.id.content_page_frame, fragment, OfferZoneDetailFragment.ARG_ITEM_ID); 

,而不是

transaction.replace(R.id.content_page_frame, fragment, OfferZoneDetailFragment.ARG_ITEM_ID); 

可能是,如果不解決你的問題,然後使用下面的機制,它會解決你的問題: -

檢查您的碎片已經在你的堆棧中,然後附加已有的片段。

否則會添加Frament的新實例。

使用sacenario這樣的代碼:

android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); 
       AndroidFragment androidFragment = (AndroidFragment) fm.findFragmentByTag("android"); 
       AppleFragment appleFragment = (AppleFragment) fm.findFragmentByTag("apple"); 
       android.support.v4.app.FragmentTransaction ft = fm.beginTransaction(); 

       /** Detaches the androidfragment if exists */ 
       if(androidFragment!=null) 
        ft.detach(androidFragment); 

       /** Detaches the applefragment if exists */ 
       if(appleFragment!=null) 
        ft.detach(appleFragment); 

       /** If current tab is android */ 
       if(tabId.equalsIgnoreCase("android")){ 

        if(androidFragment==null){ 
         /** Create AndroidFragment and adding to fragmenttransaction */ 
         ft.add(R.id.realtabcontent,new AndroidFragment(), "android"); 
        }else{ 
         /** Bring to the front, if already exists in the fragmenttransaction */ 
         ft.attach(androidFragment); 
        } 

       }else{ /** If current tab is apple */ 
        if(appleFragment==null){ 
         /** Create AppleFragment and adding to fragmenttransaction */ 
         ft.add(R.id.realtabcontent,new AppleFragment(), "apple"); 
        }else{ 
         /** Bring to the front, if already exists in the fragmenttransaction */ 
         ft.attach(appleFragment); 
        } 
       } 
       ft.commit(); 

編輯:

transaction.add將顯示在backpress以前的片段,並不會通過片段生命週期

去僅供參考看看這個onTabChanged:http://wptrafficanalyzer.in/blog/creating-navigation-tabs-using-tabhost-and-fragments-in-android/

+0

是的transaction.add爲我工作,非常感謝 – Sree

+0

喲,歡迎@Sree –

+0

@Sree,這是一個很好的答覆,我沒有想到attach/detach保留狀態,但在這種情況下,transaction.show()和.hide()方法怎麼樣,請問你可以檢查它們嗎?我的意思是隻顯示一個,並隱藏另一個,如果這個工作,它會更好的表現,然後附加和分離。 –

-1

其實這兩個片段在一個活動中,如果你從一個片段轉移到另一個片段,它已經取代了以前的片段,這就是爲什麼你不能檢索前一個片段,但是如果你計算回按鈕位置並將其設置爲switch-case,它可以是可能的..

@Override 
public void onBackPressed() 
{ 
    super.onBackPressed(); 
    switch(pager.getselecteditem()) 
case 0: 
exit(); 
break; 
case:1 
pager.setselecteditem(pager.getselecteditem()-1); 
break; 
} 

讓我知道,如果它可以幫助你

+0

如何做到這一點?/ – Sree