我是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>
答案 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;
}
}