在我的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);
}
}
setLabelTextView()我想从主活动的onResume()处理程序调用,但我还没有能够处理允许我使用的片段访问此方法。我现在走了一些圈子,因为我已经找到了不同的方法来访问片段中的视图,这似乎是最合理的,但我还没有成功。我如何从我的活动中调用setLabelText()方法?
@Override
protected void onResume() {
super.onResume();
// set the labelTextView here
}
答案 0 :(得分:3)
直截了当的方式是查找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
并跟踪自己的片段列表。喜欢这个
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
到Fragment
通信。那里有一些事件总线实现。您可以尝试TinyBus或EventBus。
答案 1 :(得分:0)
我不认为这是最好的解决方案,但您可以尝试使用内部名称按标签名称检索片段:
"android:switcher:" + viewId + ":" + index;
答案 2 :(得分:0)
尝试一下
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) {
}
});