从 Activity 调用 Fragment 方法,findFragmentById returns null

Calling Fragment method from Activity,findFragmentById returns 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 {
}

当然还有 Fragment 类:

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

基本上一切似乎都在图形上运行良好。

但是,我正在尝试从 Activity 调用片段的方法。我是这样做的:

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

这里 fm.findFragmentById 总是 return null.

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

如何获取 Fragment 类?

编辑:

这是 Fragment 的布局:

<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>

这里是 Activity 的布局

<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>

使用这个:

在您的适配器中添加一个 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

祝你好运!

如果您不使用 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;
        }
    }