android片段在事务后没有显示前一个位置

时间:2015-09-22 05:32:35

标签: android fragment fragmenttransaction fragment-transitions

让我们考虑一下,我有2 fragment a & b

使用滚动片段包含视图寻呼机,水平网格视图和按钮图像等。 当我点击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();

如何从其他片段返回时加载片段事务开始位置。

2 个答案:

答案 0 :(得分: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); 

可能是,如果它没有解决你的问题然后使用以下机制,它将解决你的问题: -

检查你的Fragment是否已经在你的堆栈中,然后附加已经存在的片段。

否则添加新的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上显示上一个片段,并且不会经历片段生命周期

For Reference请参阅onTabChanged:http://wptrafficanalyzer.in/blog/creating-navigation-tabs-using-tabhost-and-fragments-in-android/

答案 1 :(得分:-1)

实际上,如果你从一个片段转移到另一个片段,那么两个片段在一个活动中它已经替换了之前的片段,这就是为什么你不能检索以前的片段但是如果你倒数按钮位置并将其设置为切换它就有可能-case所以它是可能的..

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

让我知道它是否有助于你