下面是我的代码,它有3个片断类
,每个片断类嵌入了ViewPager
上的3个选项卡。我有菜单选项。如OnOptionSitemSelect()
所示,通过选择一个选项,我需要更新当前可见的片段。要更新它,我必须调用fragment类中的一个方法。有人能建议一下如何调用那个方法吗?
public class MainActivity extends ActionBarActivity {
ViewPager ViewPager;
TabsAdapter TabsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewPager = new ViewPager(this);
ViewPager.setId(R.id.pager);
setContentView(ViewPager);
final ActionBar bar = getSupportActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//Attaching the Tabs to the fragment classes and setting the tab title.
TabsAdapter = new TabsAdapter(this, ViewPager);
TabsAdapter.addTab(bar.newTab().setText("FragmentClass1"),
FragmentClass1.class, null);
TabsAdapter.addTab(bar.newTab().setText("FragmentClass2"),
FragmentClass2.class, null);
TabsAdapter.addTab(bar.newTab().setText("FragmentClass3"),
FragmentClass3.class, null);
if (savedInstanceState != null) {
bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.addText:
**// Here I need to call the method which exists in the currently visible Fragment class**
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex());
}
public static class TabsAdapter extends FragmentPagerAdapter
implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(ActionBarActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i=0; i<mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
tabPosition = tab.getPosition();
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}
@Override
public int getCount() {
return mTabs.size();
}
}
}
假设下面是我要调用的具有updateList()
方法的片段类:
public class FragmentClass1{
ArrayList<String> originalData;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.frag1, container, false);
originalData = getOriginalDataFromDB();
return fragmentView;
}
public void updateList(String text)
{
originalData.add(text);
//Here I could do other UI part that need to added
}
}
通过选择一个选项,我需要更新当前可见的片段。
这样做的一个简单方法是使用与FragmentPagerAdapter
实现相关的技巧:
case R.id.addText:
Fragment page = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + ViewPager.getCurrentItem());
// based on the current position you can then cast the page to the correct
// class and call the method:
if (ViewPager.getCurrentItem() == 0 && page != null) {
((FragmentClass1)page).updateList("new item");
}
return true;
请重新考虑变量命名约定,使用类的名称作为变量名非常混乱(因此不使用viewpager
,使用viewpager mpager
)。
我所拥有的 我不能使用onResume(),因为左边和右边的片段已经创建了。我不能使用setUserVisibilityHint(),因为它是在onCreateView()之前调用的,所以视图还没有准备好。 那么,当某个特定片段对用户可见时,应该采用什么方法来动画视图呢?
我使用来显示几个片段,在我的上也有。我需要更改中的文本,这取决于当前在中选择的片段。我遇到的问题是:有一些缓存机制,它在片段对用户真正可见之前对它们进行实例化,例如,当我在中选择第二个页面时,也创建了第三个页面的片段。更重要的是,我不能确定片断内部是现在可见的片断还是它只是由创建的,但对用户来说并不是真的可见的。我尝试使用来实现这一目的,但对我来说,对它所做的更改速度太慢(页面滚动,然后我的已经更
我有一个父ViewPager,我在其中传递了FragmentStatePagerAdapter。现在片段中有另一个子ViewPager在父ViewPager中。因此,当我尝试对父ViewPager的适配器进行notifyDataSetChanged时,将重新创建所有片段,但子ViewPager的当前项位置仍然与重新创建片段的子ViewPager的位置之前相同。 那么,如何重置子viewpager当
本文向大家介绍Android中ViewPager获取当前显示的Fragment,包括了Android中ViewPager获取当前显示的Fragment的使用技巧和注意事项,需要的朋友参考一下 前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment类似的方
在我的应用程序中,我有一个ViewPager,里面有很多可滑动的标签,里面有碎片。是否有像这样的方法,每次片段出现在屏幕上时都会调用它?等是在创建片段之后调用的,而不是在片段出现在屏幕上时调用的,因此它们对我不起作用。我的问题可以用哪种方法?
有没有什么好的方法来引用用创建的片段?或者我应该如何从我的活动(准确地说是从选项菜单)中刷新查看页中的片段?