2015-01-07 60 views
0

我是Fragments的新手。我正在嘗試開發滑動選項卡。從Activity調用Fragment方法,findFragmentById返回null

我有以下適配器:

public class HomeTabsPagerAdapter extends FragmentPagerAdapter { 

    public HomeTabsPagerAdapter(android.support.v4.app.FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public android.support.v4.app.Fragment getItem(int idx) { 
     switch (idx) { 
     case CONSTS_MAIN.TAB_WATCH: 
      return new WatchFragment(); 
     case CONSTS_MAIN.TAB_DISCOVER: 
      return new DiscoverFragment(); 
     case CONSTS_MAIN.TAB_LOG: 
      return new LogFragment(); 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     return CONSTS_MAIN.HOME_NO_OF_TABS; 
    } 

} 

和MainActivity.java

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { 
} 

,當然,分片類:

public class WatchFragment extends Fragment { 
public class DiscoverFragment extends Fragment { 
public class LogFragment extends Fragment { 

,基本上一切似乎做工精細圖形。

但是,我試圖從活動中調用碎片的方法。我這樣做:

FragmentManager fm = getSupportFragmentManager(); 
WatchFragment watchFragment = (WatchFragment) fm.findFragmentById(R.id.watch_fragment); 
watchFragment.refresh(); 

和這裏fm.findFragmentById總是返回null。

我一直在使用android.support.v4.app

如何獲得片段類?

編輯:

這裏是片段的佈局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id ="@+id/watch_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:label="@string/title_activity_watch" 
    android:orientation="vertical" > 

    <com.x.y.custom_controls.CustomWatchChronologicalListView 
     android:id="@+id/lvWatchChronologicalDiscussions" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout> 

,這裏是活動的佈局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
    </android.support.v4.view.ViewPager> 

</RelativeLayout> 
+0

也許你正在使用'WatchFragment watchFragment =(WatchFragment)fm.findFragmentById(R.id.watch_fragment)ID;'不正確。你確定'WatchFragment'被加載到'R.id.watch_fragment'?請檢查。 – Rohit5k2

+0

你如何處理碎片?你是動態還是靜態地將它們添加到XML佈局中? –

+0

我添加了片段和活動的佈局。 @Rohit請看看Id是否不正確。 – dsb

回答

0

使用此:

在適配器中添加一個SparseArray到繼續參考添加的片段

private final SparseArray<Fragment> mPageReferences = new SparseArray<Fragment>(); 

在你的getItem方法之後實例化的片段將它添加到陣列:

@Override 
public android.support.v4.app.Fragment getItem(int idx) 
{ 
    Fragment fragment = null; 

    switch (idx) 
    { 
     case CONSTS_MAIN.TAB_WATCH: 
      fragment = new WatchFragment(); 
     case CONSTS_MAIN.TAB_DISCOVER: 
      fragment = new DiscoverFragment(); 
     case CONSTS_MAIN.TAB_LOG: 
      fragment = new LogFragment(); 
    } 
    if(fragment != null) { 
     mPageReferences.put(position, fragment); 
    } 
    return fragment; 
} 

並添加以下方法:

@Override 
    public void destroyItem(ViewGroup container, int position, Object object) 
    { 
     super.destroyItem(container, position, object); 
     mPageReferences.remove(position); 
    } 

    public SherlockFragment getFragment(int key) { 
     return mPageReferences.get(key); 
    } 

最後你可以在索引中的片段,你想要這樣:

Fragment fragment = (Fragment)adapter.getFragment(index); 

如果你想用鍵來識別碎片而不是int索引,你可以使用一個HashMap

祝你好運!

+0

工作!謝謝。 – dsb

0

如果您未在xml中使用片段標記定義片段,則無法執行findFragmentById。 在這裏,您將相對佈局的id傳遞給方法findFragmentById。 的方法是使用你得到的片段例如從fragmentMnager-

WatchFragment watchFragment=(WatchFragment)getFragment(0); 
    watchFragment.refresh(); 


    //getFragment Method 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    List<Fragment> fragmentList=fragmentManager.getFragments(); 
public Fragment getFragment(int index){ 
     for (Fragment fragment:fragmentList){ 
      if (fragment.getId()==index) 
       return fragment; 
     } 
    } 
相關問題