繁体   English   中英

在ViewPager片段中更新TextView

[英]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通信。 那里有一些事件总线实现。 您可以尝试TinyBusEventBus

我不认为这是最好的解决方案,但你可以尝试使用内部名称按标签名称检索片段:

"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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM