[英]Updating a TextView in a ViewPager Fragment
在我的Android应用程序中,我在设置位于父活动的片段中的TextView时遇到问题。 我使用ViewPager如下:
在我的主要活动的onCreate()中:
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, MainPageProfileFragment.class.getName()));
fragments.add(Fragment.instantiate(this, MainPageOtherFragment.class.getName()));
mainPagerAdapter = new ViewPagerAdapter(this.getSupportFragmentManager(), fragments);
ViewPager pager = (ViewPager)findViewById(R.id.viewpager);
pager.setAdapter(mainPagerAdapter);
使用ViewPagerAdapter:
public class ViewPagerAdapter extends FragmentPagerAdapter{
private List<Fragment> fragments;
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super (fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int arg0) {
return this.fragments.get(arg0);
}
}
以及下面的MainPageProfileFragment。 此片段提供了一个在运行时更新TextView的接口(在创建视图之后)。
public class MainPageProfileFragment extends Fragment
implements View.OnClickListener {
private TextView profileImageLabelTextView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(container == null) {
return null;
}
ScrollView view = (ScrollView)inflater.inflate(R.layout.fragment_main_page_profile, container, false);
labelTextView = (TextView) view.findViewById(R.id.profileLabel);
return view;
}
public void setLabelText(String text) {
labelTextView.setText(text);
}
}
我想从main活动的onResume()处理程序调用setLabelTextView(),但是我还没有能够获得允许我访问此方法的片段句柄。 我现在走了一些圈子,因为我找到了不同的方法来访问碎片中的视图,这似乎是最合理的但我还没有成功。 如何从我的活动中调用setLabelText()方法?
@Override
protected void onResume() {
super.onResume();
// set the labelTextView here
}
直截了当的方式是查找ViewPager
,然后使用ViewPagerAdapter
,然后尝试获取片段。 如果片段存在,则可以调用setLabelText()
方法。 像这样的东西。
@Override
protected void onResume() {
super.onResume();
ViewPager pager = (ViewPager)findViewById(R.id.viewpager);
ViewPagerAdapter adapter = (ViewPagerAdapter) pager.getAdapter();
Fragment fragment = adapter.getItem(0);
if (fragment instanceof MainPageProfileFragment) {
// if we are here, then fragment is not null and has correct type
((MainPageProfileFragment)fragment).setLabelText("my text");
}
}
要将getItem()
方法添加到Adapter
,您应该扩展FragmentPagerAdapter
并跟踪自己的Fragment列表。 像这样
public class PagerAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragments = new ArrayList<Fragment>();
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
public void addFragment(Fragment fragment) {
mFragments.add(fragment);
notifyDataSetChanged();
}
}
但更优雅和灵活的解决方案是使用事件总线进行Activity
to Fragment
通信。 那里有一些事件总线实现。 您可以尝试TinyBus或EventBus 。
我不认为这是最好的解决方案,但你可以尝试使用内部名称按标签名称检索片段:
"android:switcher:" + viewId + ":" + index;
尝试这个
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
ViewPagerAdapter adapter = (ViewPagerAdapter) viewPager.getAdapter();
Fragment fragment = adapter.getItem(position);
if (fragment instanceof BiographyFragment) {
// if we are here, then fragment is not null and has correct type
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
((BiographyFragment) fragment).mTextViewBiography.setText(fromHtml(mBiography, Html.FROM_HTML_MODE_LEGACY));
} else {
((BiographyFragment) fragment).mTextViewBiography.setText(fromHtml(mBiography));
}
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.