从 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;
}
}
我是片段的新手。我正在尝试开发滑动标签。
我有以下适配器:
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;
}
}