在ViewPager片段中更新TextView

时间:2014-11-12 20:38:22

标签: java android android-fragments android-viewpager

在我的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
}

3 个答案:

答案 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();
    }
}

但更优雅和灵活的解决方案是使用事件总线进行ActivityFragment通信。那里有一些事件总线实现。您可以尝试TinyBusEventBus

答案 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) {

            }
        });