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