从Activity调用Fragment方法,findFragmentById返回null

时间:2015-01-07 19:46:56

标签: android android-fragments

我是Fragments的新手。我正在尝试开发滑动标签。

我有以下适配器:

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中调用Fragment的方法。我是这样做的:

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

此处fm.findFragmentById始终返回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>

这是活动的布局

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

2 个答案:

答案 0 :(得分: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 index,可以使用HashMap

祝你好运!

答案 1 :(得分:0)

如果未使用xml中的fragment标签定义片段,则无法执行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;
        }
    }