2015-05-09 54 views
0

我使用FragmentTagManager,現在我想訪問當前活動的片段並在按下後退按鈕時調用方法。獲取FragmentTagManger中後退按鈕事件的當前片段

我想要得到的片段是一個容器。因爲我在選項卡內動態地改變Fragments,所以我需要訪問容器並從它的超類中調用一個方法,並且不能直接從FragmentStack中彈出()。

如何訪問顯示在Tab中的當前Fragment?

現在我有這個

Main.java

private FragmentTabHost mTabHost; 




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

     mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
     mTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent); 

     mTabHost.addTab(
       mTabHost.newTabSpec(TAB_1).setIndicator(getString(R.string.music), null), 
       MusicListContainerFragment.class, null); 
     mTabHost.addTab(
       mTabHost.newTabSpec(TAB_2).setIndicator(getString(R.string.devices), null), 
       DeviceChooserFragment.class, null); 
     mTabHost.addTab(
       mTabHost.newTabSpec(TAB_3).setIndicator(getString(R.string.musicplayer), null), 
       MusicPlayerFragment.class, null); 
} 
    @Override 
    public void onBackPressed() { 
     System.out.println(mTabHost.getCurrentTab()); 
     if(mTabHost.getCurrentTab() == 0){ 
      System.out.println(getFragmentManager().findFragmentByTag(TAB_1));//NULL 
      System.out.println(getFragmentManager().findFragmentById(R.id.container));// NULL 

     } 
    } 

Basecontainer.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
</FrameLayout> 

ContainerFragment

public class MusicListContainerFragment extends BaseContainerFragment { 
    private boolean mIsViewInited; 

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

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if (!mIsViewInited) { 
      mIsViewInited = true; 
      initView(); 
     } 
    } 

    private void initView() { 
     replaceFragment(new MusicListFragment(), false); 
    } 
} 

回答

0

我希望您發現在此期間解決方案自從喲你的問題發佈於3個月前。不過,我面臨同樣的問題,並提出了這個解決方案。

如果你想覆蓋< - 按鈕ActionBar中使用

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      // this takes the user 'back', as if they pressed the left-facing triangle icon on the main android toolbar. 
      // if this doesn't work as desired, another possibility is to call `finish()` here. 
      if (getFragmentManager().findFragmentById(R.id.activity_profile) instanceof FragmentOfYourChoice) { 
       onBackPressed(); 
       return true; 
      } 
      else 
       super.onOptionsItemSelected(item); 

     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

我認爲,如果你去的地方是在你的堆棧中無分段要觸發活動點中彈出的堆棧中。這是觸發「其他」分支的原因。

如果你想在按下實際的「後退按鈕」(三角形)時獲得相同的效果,你必須重寫onBackPressed()方法。

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 1) 
     getFragmentManager().popBackStack(); 
    else 
     super.onBackPressed(); 
} 
0

也許你可以使用OnBackStackChangedListener知道什麼時候有一個片段堆棧的變化,無論是設置方法/取消設置片段棧,如圖所示:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      //TODO: Handle your stacks changes here 
      Log.d(Constants.TAG,"Stack Entry Count: "+getSupportFragmentManager().getBackStackEntryCount()); 
     } 
    }); 

Regards.-