1

我正在开发一个基于 viewPager 的简单应用程序。我正在尝试更改 mainActivity 片段内 textView 中的文本。我试图在 init() 方法(片段被实例化的地方)之后立即调用 textV.setText(String),但是 OnCreateView 执行得更晚,所以在那一刻对 textV 的引用为空。textV的textView放在tab0layout.xml中,布局文件膨胀时变成!=null,在Fragment0的OnCreateView方法内部引用。如何在 MainActivity 中获得对 textV 的有效引用?在 OnCreateView 中设置文本工作正常,但我需要它在 mainActivity 中可用。

这是整个java文件:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    SectionsPagerAdapter mSectionsPagerAdapter;

    ViewPager mViewPager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();//fragment is instantiated

        Fragment0.textV.setText("new text");//doesn't work, now textV is null!!
    }

    private void init() {

        List<Fragment> fragments = new Vector<Fragment>();
        fragments.add(Fragment.instantiate(this, Fragment0.class.getName()));

        this.mSectionsPagerAdapter = new SectionsPagerAdapter(super.getSupportFragmentManager(), fragments);
        mViewPager = (ViewPager) super.findViewById(R.id.pager);
        mViewPager.setAdapter(this.mSectionsPagerAdapter);


    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, switch to the corresponding page in
        // the ViewPager.
        mViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }


    public class SectionsPagerAdapter extends FragmentPagerAdapter {
        private List<Fragment> fragments;

        public SectionsPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
            super(fm);
            this.fragments = fragments;
        }

        @Override
        public Fragment getItem(int position) {
            return this.fragments.get(position);
        }

        /* (non-Javadoc)
         * @see android.support.v4.view.PagerAdapter#getCount()
         */
        @Override
        public int getCount() {
            return this.fragments.size();
        }
    }


    public static class Fragment0 extends Fragment {

        static TextView textV;

        public Fragment0() {

        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.tab0_layout, container, false);

            textV = (TextView) rootView.findViewById(R.id.text);

            return rootView;
        }
    }

}
4

3 回答 3

0

您应该能够处理onActivityCreated然后使用FragmentManager获取您的参考,您可以在其中根据需要设置/获取文本。Fragment一旦Activity 被实例化并准备好,这将被调用。如果您愿意,您可以稍后存储参考用途。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Fragment fragment = (Fragment)(getSupportFragmentManager().findFragmentById(R.id.thefragmentId));

}
于 2013-09-27T20:30:47.557 回答
0

当主要活动的 on create 函数返回时,片段管理 r 调用为所有附加片段创建的活动。那时片段视图被创建。因此,您需要做的是在活动恢复中设置文本。你想要你做的只是在片段上调用一个将文本设置为字符串变量的函数,然后在片段的 onresume 函数中设置该值

于 2013-09-27T20:33:00.603 回答
0

您可以在您的活动中创建公共方法并以这种方式Fragment获取/设置。TextView

您可以通过以下方式获取当前片段:

FragmentManager fm = this.getSupportFragmentManager();
YourFragment fragment = (YourFragment ) fm.getFragments().get(mViewPager.getCurrentItem());
于 2013-09-27T20:27:45.277 回答