2016-08-23 24 views
3

我已經使用viewpager創建了一個標籤佈局。 一切都很好,除了我需要在特定時刻運行一個方法。所以我需要得到片段實例並運行他們的方法。 我以這種方式創建:設置並獲取在android中使用標籤片段

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 
    activateToolbarWithNavigationView(HomeActivity.this); 
    // Tabs Setup 
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
    final ViewPager viewPager = (ViewPager) findViewById(R.id.home_pager); 
    if (tabLayout != null) { 
     tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.favorites_label_fragment)).setTag(getString(R.string.fragment_favorite_tag))); 
     tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.air_today_label_fragment)).setTag(getString(R.string.fragment_airing_today_tag))); 
     tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
     final HomePageAdapter adapter = new HomePageAdapter 
       (getSupportFragmentManager(), tabLayout.getTabCount()); 
     if (viewPager != null) { 
      viewPager.setAdapter(adapter); 
      viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
      tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
       @Override 
       public void onTabSelected(TabLayout.Tab tab) { 
        viewPager.setCurrentItem(tab.getPosition()); 
       } 

       @Override 
       public void onTabUnselected(TabLayout.Tab tab) { 

       } 

       @Override 
       public void onTabReselected(TabLayout.Tab tab) { 

       } 
      }); 
     } 
} 
public void refreshFavorites(){ 
    FavoritesFragment favoritesFragment = (FavoritesFragment) getSupportFragmentManager().findFragmentByTag(getString(R.string.fragment_favorite_tag)); 
    if(favoritesFragment != null) favoritesFragment.executeFavoriteList(); 
} 

我不知道如果我在錯誤的方式做,還是有一些錯誤,他們返回null從findFragmentByTag ......我想不通。如果我查了一些其他的答案,但我不明白我真的需要做什麼。

viewpager適配器:

public class HomePageAdapter extends FragmentStatePagerAdapter { 
    int mNumOfTabs; 

    public HomePageAdapter(FragmentManager fm, int NumOfTabs) { 
     super(fm); 
     this.mNumOfTabs = NumOfTabs; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       FavoritesFragment favoritesFragment = new FavoritesFragment(); 
       return favoritesFragment; 
      case 1: 
       AirTodayFragment airTodayFragment = new AirTodayFragment(); 
       return airTodayFragment; 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return mNumOfTabs; 
    } 
} 

我的xml:

<android.support.design.widget.CoordinatorLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_above="@+id/ad_view_home"> 

     <android.support.design.widget.AppBarLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:minHeight="?actionBarSize" 
      android:theme="@style/ActionBarThemeOverlay"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/app_bar" 
       android:layout_width="match_parent" 
       android:layout_height="?actionBarSize" 
       app:layout_scrollFlags="scroll|enterAlways" 
       app:logo="@mipmap/ic_launcher_initials" 
       app:popupTheme="@style/AppTheme.PopupOverlay" 
       app:theme="@style/ActionBarThemeOverlay" 
       app:titleTextAppearance="@style/ActionBar.TitleText"> 
      </android.support.v7.widget.Toolbar> 

      <android.support.design.widget.TabLayout 
       android:id="@+id/tab_layout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_below="@+id/app_bar_layout" 
       android:background="?attr/colorPrimary" 
       android:minHeight="?attr/actionBarSize" 
       android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 

     </android.support.design.widget.AppBarLayout> 

     <android.support.v4.view.ViewPager 
      android:id="@+id/home_pager" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

    </android.support.design.widget.CoordinatorLayout> 

我怎麼解決:

public void refreshFavorites(){ 
    List<Fragment> allFragments = getSupportFragmentManager().getFragments(); 
    for (Fragment fragmento: allFragments) { 
     if (fragmento instanceof FavoritesFragment){ 
      ((FavoritesFragment) fragmento).executeFavoriteList(); 
     } 
    } 
} 

回答

7

你是不是因爲這是你的原因片段設置標籤null

而不是使用,FavoritesFragment favoritesFragment = (FavoritesFragment) getSupportFragmentManager().findFragmentByTag(getString(R.string.fragment_favorite_tag));

使用此,

FavoritesFragment favoritesFragment = (FavoritesFragment) getSupportFragmentManager().getFragments().get(0);得到FavoritesFragment的實例。

我已經把get(0)當你的FavoritesFragment實例的位置是零。 (1)

+1

這幾乎適用於我,但由於某種原因,得到(0)得到AirTodayFragment和.get(1)得到FavoritesFragment,所以我做了一個循環在片段中當收藏夾片段 – Adley

+0

get(位置)獲取片段「位置」的實例在標籤中被編輯。因此,如果AirTodayFragment第一個選項卡,即位置0,則獲取(0)將返回AirTodayFragment。 我很高興你找到了解決問題的方法,使用instanceOf。 – tpk

+0

其實,FavoritesFragment是第一個選項卡,因爲這個我更喜歡用這個方法來避免錯誤或者一些錯誤。謝謝您的幫助! – Adley