2016-08-23 10 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(); 
} 

は、私にはわからない、または彼らはfindFragmentByTagからnullを返すことを、いくつかのミスが...私はそこに把握することはできません。場合によっては、私はいくつかの他の答えをチェックしたが、私は本当に必要なものを理解することはできません。

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

0代わりに使用したの

FavoritesFragment favoritesFragment = (FavoritesFragment) getSupportFragmentManager().findFragmentByTag(getString(R.string.fragment_favorite_tag));

使用この、

FavoritesFragment favoritesFragment = (FavoritesFragment) getSupportFragmentManager().getFragments().get(0); FavoritesFragmentのインスタンスを取得します。

私はFavoritesFragmentインスタンスの位置がゼロであるため、get(0)を入れました。 AirTodayFragmentインスタンスを1位に取得することができます。

+1

これは私にとってはほとんど役に立ったが、何らかの理由でget(0)がAirTodayFragmentを取得していて、getget(1)がFavoritesFragmentを取得していたので、フラグメントのループを開始します。お気に入りフラグ – Adley

+0

get(position)は、タブのフラグメント "position"のインスタンスを取得します。したがって、AirTodayFragmentが最初のタブ、つまり位置0にある場合は、AirTodayFragmentを返します(0)。 instanceOfを使用して問題を回避できたことを嬉しく思います。 – tpk

+0

実際にはFavoritesFragmentがタブの先頭に表示されています。このため、このメソッドを使用してエラーやいくつかの間違いを避けることをお勧めします。助けてくれてありがとう! – Adley

関連する問題