如何使用FragmentPagerAdapter有标签具有不同的内容? [英] How do I use FragmentPagerAdapter to have tabs with different content?

查看:230
本文介绍了如何使用FragmentPagerAdapter有标签具有不同的内容?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想有不同的选项卡,在这里你可以刷卡通过像在Android Market。每个选项卡应该使用一个片段,并使用一种方法它

这是我FragmentPagerAdapter类:

 公共类SectionsPagerAdapter扩展FragmentPagerAdapter {

    公共SectionsPagerAdapter(FragmentManager FM){
        超(FM);
    }

    @覆盖
    公共片段的getItem(INT位置){
        片段片段= NULL;
        开关(位置){
            情况下0:
                片段=新ConnectionFragment();
                打破;
            情况1:
                片段=新DataFragment();
                打破;
            案例2:
                片段=新GraphFragment();
                打破; }
        返回片段;
    }
    @覆盖
    公众诠释getCount将(){
        //显示3总页​​数。
        返回3;
    }
}
 

和我有三个班每个片断类型/标签:

 公共静态类ConnectionFragment扩展片段{
    公共静态最后弦乐ARG_SECTION_NUMBER =section_number标;
    公共字符串stringConnectionStatus =脱机;
    公共字符串stringWiflyIp =0.0.0.0;

    公共ConnectionFragment(){}

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        查看connectionView = inflater.inflate(R.layout.fragment_connection,
                集装箱,假);
        TextView的statusView =(TextView中)connectionView.findViewById(R.id.status_label);
        statusView.setText(连接状态:+ stringConnectionStatus);
        TextView的ipView =(TextView中)connectionView.findViewById(R.id.ip_label);
        ipView.setText(WiFly IP:+ stringWiflyIp);
        / **的TextView sectionBarView =(TextView中)connectionView
                .findViewById(R.id.section_label);
        sectionBarView.setText(幼崽);* /

        返回connectionView;
    }
}

公共静态类DataFragment扩展片段{

    公共DataFragment(){}

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        查看数据视图= inflater.inflate(R.layout.fragment_data,
                集装箱,假);
        TextView的sectionBarView =(TextView的)数据视图
                .findViewById(R.id.section_label);
        sectionBarView.setText(pups2);
        返回数据视图;
    }
}

公共静态类GraphFragment扩展片段{

    公共GraphFragment(){
    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        查看rootView = inflater.inflate(R.layout.fragment_graph,
                集装箱,假);
        TextView的sectionBarView =(TextView中)rootView
                .findViewById(R.id.section_label);
        sectionBarView.setText(pups3);
        返回rootView;
    }
}
 

每个片段应该是定制的,这就是为什么我有三个班。

不过,在为getItem方法的应用程序崩溃。有任何想法吗? 谢谢!

编辑:完整的MainActivity.java:

 进口...
公共类MainActivity扩展FragmentActivity {

    / **
     *在{@link android.support.v4.view.PagerAdapter},将提供
     *对于每个部分的片段。我们使用
     * {@link android.support.v4.app.FragmentPagerAdapter}衍生物,它
     *将让每一个加载的片段记忆。如果这成为过记忆
     *密集,它可能是最好切换到
     * {@link android.support.v4.app.FragmentStatePagerAdapter}。
     * /
    SectionsPagerAdapter mSectionsPagerAdapter;
    公开名单<字符串>碎片=新矢量<串GT;();

    / **
     *在{@link ViewPager}将承载部分内容。
     * /
    ViewPager mViewPager;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        //创建将返回一个片段为三个的适配器
        //应用程序的主要部分。
        mSectionsPagerAdapter =新SectionsPagerAdapter(getSupportFragmentManager());

        //设置的ViewPager与部分适配器。
        mViewPager =(ViewPager)findViewById(R.id.pager); //寻呼机
        mViewPager.setAdapter(mSectionsPagerAdapter);


    }

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        //充气菜单;这增加了项目操作栏,如果它是present。
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }

    / **
     * A {@link FragmentPagerAdapter}返回对应的片段
     *章节/标签/页之一。
     * /


    公共类SectionsPagerAdapter扩展FragmentPagerAdapter {


        公共SectionsPagerAdapter(FragmentManager FM){
            超(FM);
            fragments.add(ConnectionFragment.class.getName());
            fragments.add(DataFragment.class.getName());
            fragments.add(GraphFragment.class.getName());
            // fragmentsA =片段;

        }

        @覆盖
        公共片段的getItem(INT位置){
            //的getItem被称为实例化片段给定的页面。
            //返回一个DummySectionFragment(定义为静态内部类
            下图)与页面数量作为其唯一的参数//。
            / *片段片段= NULL;
            开关(位置){
                情况下0:
                    片段=新ConnectionFragment();
                    打破;
                情况1:
                    片段=新DataFragment();
                    打破;
                案例2:
                    片段=新GraphFragment();
                    打破; }
            返回片段; * /
            返回Fragment.instantiate(getBaseContext(),fragments.get(位置));

        }
        @覆盖
        公众诠释getCount将(){
            //显示3总页​​数。
            返回3;
        }

        @覆盖
        公共CharSequence的getPageTitle(INT位置){
            区域设置L = Locale.getDefault();
            开关(位置){
            情况下0:
                返回的getString(R.string.title_section1).toUpperCase(升);
            情况1:
                返回的getString(R.string.title_section2).toUpperCase(升);
            案例2:
                返回的getString(R.string.title_section3).toUpperCase(升);
            }
            返回null;
        }
    }


    / **
     *一个虚拟片段重新presenting应用程序的一部分,但只是
     *显示虚拟文本。
     * /
    公共静态类ConnectionFragment扩展片段{
        / **
         *片段参数重新presenting本章节号
         * 分段。
         * /
        公共静态最后弦乐ARG_SECTION_NUMBER =section_number标;
        公共字符串stringConnectionStatus =脱机;
        公共字符串stringWiflyIp =0.0.0.0;

        公共ConnectionFragment(){}

        @覆盖
        公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
                捆绑savedInstanceState){
            查看connectionView = inflater.inflate(R.layout.fragment_connection,集装箱,假);
            TextView的statusView =(TextView中)connectionView.findViewById(R.id.status_label);
            statusView.setText(连接状态:+ stringConnectionStatus);
            TextView的ipView =(TextView中)connectionView.findViewById(R.id.ip_label);
            ipView.setText(WiFly IP:+ stringWiflyIp);
            / **的TextView sectionBarView =(TextView中)connectionView
                    .findViewById(R.id.section_label);
            sectionBarView.setText(幼崽);* /

            返回connectionView;
        }
    }
    公共静态类DataFragment扩展片段{

        公共DataFragment(){}

        @覆盖
        公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
                捆绑savedInstanceState){
            查看数据视图= inflater.inflate(R.layout.fragment_data,
                    集装箱,假);
            // TextView的sectionBarView =(TextView中)dataView.findViewById(R.id.section_label);
            //sectionBarView.setText("pups2);
            返回数据视图;
        }
    }
    公共静态类GraphFragment扩展片段{

        公共GraphFragment(){}

        @覆盖
        公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
                捆绑savedInstanceState){
            查看rootView = inflater.inflate(R.layout.fragment_graph,
                    集装箱,假);
            // TextView的sectionBarView =(TextView中)rootView.findViewById(R.id.section_label);
            //sectionBarView.setText("pups3);
            返回rootView;
        }
    }
}
 

解决方案

创建适配器:

 类MyPagerAdapter扩展FragmentPagerAdapter {
        公开名单<字符串> fragmentsA;

        公共MyPagerAdapter(FragmentManager FM){
            超(FM);
            fragmentsA =片段; S
        }

        @覆盖
        公共片段的getItem(INT位置){
            //返回MyFragment.newInstance();
            返回Fragment.instantiate(背景下,fragmentsA.get(位置));

        }

        @覆盖
        公共CharSequence的getPageTitle(INT位置){
            //返回含量[位置%CONTENT.length] .toUpperCase();
            返回mEntries.get(位置%CONTENT.length).toUpperCase();
        }

        @覆盖
        公众诠释getCount将(){
           //返回CONTENT.length;
            返回mEntries.size();
        }

        @覆盖
        公众诠释getItemPosition(Object对象){
            返回POSITION_NONE;
        }
    }
 

每个片段属于不同的类别。

所以,你必须定义一个片段列表(这些进入主FragmentActivity):

 静态MyPagerAdapter适配器;
 

和与片段填充:

  fragments.add(ConnectionFragment.class.getName());
fragments.add(DataFragment.class.getName());
fragments.add(Tab3.class.getName());
//..等等
 

然后,你必须将片段添加到这样的适配器:

 寻呼机=(ViewPager)findViewById(R.id.viewpager);
 适配器=新MyPagerAdapter(getSupportFragmentManager());
 pager.setAdapter(适配器);
 

在MyPagerAdaper将通过所有包含在该片段列表中的片段,然后将实例他们每个人。

I want to have different tabs, where you can swipe through like in the android market. Each tab should use one fragment and use one method for it.

This is my FragmentPagerAdapter class:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);  
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment =null;
        switch (position) {
            case 0:
                fragment = new ConnectionFragment();
                break;
            case 1:
                fragment = new DataFragment();
                break;              
            case 2:
                fragment = new GraphFragment();
                break;          }
        return fragment;    
    }
    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }
}

And I have three classes for each fragment type/tab:

public static class ConnectionFragment extends Fragment {
    public static final String ARG_SECTION_NUMBER = "section_number";
    public String stringConnectionStatus = "Offline";
    public String stringWiflyIp = "0.0.0.0";

    public ConnectionFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View connectionView = inflater.inflate(R.layout.fragment_connection,
                container, false);
        TextView statusView = (TextView) connectionView.findViewById(R.id.status_label);
        statusView.setText("Connection status: " + stringConnectionStatus);
        TextView ipView = (TextView) connectionView.findViewById(R.id.ip_label);
        ipView.setText("WiFly IP: " + stringWiflyIp);
        /**TextView sectionBarView = (TextView) connectionView
                .findViewById(R.id.section_label);
        sectionBarView.setText("pups");"*/

        return connectionView;
    }
}

public static class DataFragment extends Fragment {

    public DataFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View dataView = inflater.inflate(R.layout.fragment_data,
                container, false);
        TextView sectionBarView = (TextView) dataView
                .findViewById(R.id.section_label);
        sectionBarView.setText("pups2");
        return dataView;
    }
}

public static class GraphFragment extends Fragment {

    public GraphFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_graph,
                container, false);
        TextView sectionBarView = (TextView) rootView
                .findViewById(R.id.section_label);
        sectionBarView.setText("pups3");
        return rootView;
    }
}

Each Fragment should be customizable, thats why I have three classes.

Nevertheless, the app crashes in the getItem method. Any ideas? Thank you!

Edit: The complete MainActivity.java:

import ...
public class MainActivity extends FragmentActivity {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
     * will keep every loaded fragment in memory. If this becomes too memory
     * intensive, it may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */
    SectionsPagerAdapter mSectionsPagerAdapter;
    public List<String> fragments = new Vector<String>();

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    ViewPager mViewPager;

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

        // Create the adapter that will return a fragment for each of the three
        // primary sections of the app.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager); //pager
        mViewPager.setAdapter(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;
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */


    public class SectionsPagerAdapter extends FragmentPagerAdapter {


        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
            fragments.add(ConnectionFragment.class.getName());
            fragments.add(DataFragment.class.getName());
            fragments.add(GraphFragment.class.getName());
            //fragmentsA = "fragments";

        }

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a DummySectionFragment (defined as a static inner class
            // below) with the page number as its lone argument.
            /*Fragment fragment =null;
            switch (position) {
                case 0:
                    fragment = new ConnectionFragment();
                    break;
                case 1:
                    fragment = new DataFragment();
                    break;              
                case 2:
                    fragment = new GraphFragment();
                    break;          }
            return fragment;*/
            return Fragment.instantiate(getBaseContext(), fragments.get(position));

        }
        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            case 2:
                return getString(R.string.title_section3).toUpperCase(l);
            }
            return null;
        }
    }


    /**
     * A dummy fragment representing a section of the app, but that simply
     * displays dummy text.
     */
    public static class ConnectionFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public static final String ARG_SECTION_NUMBER = "section_number";
        public String stringConnectionStatus = "Offline";
        public String stringWiflyIp = "0.0.0.0";

        public ConnectionFragment() {}

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View connectionView = inflater.inflate(R.layout.fragment_connection,container, false);
            TextView statusView = (TextView) connectionView.findViewById(R.id.status_label);
            statusView.setText("Connection status: " + stringConnectionStatus);
            TextView ipView = (TextView) connectionView.findViewById(R.id.ip_label);
            ipView.setText("WiFly IP: " + stringWiflyIp);
            /**TextView sectionBarView = (TextView) connectionView
                    .findViewById(R.id.section_label);
            sectionBarView.setText("pups");"*/

            return connectionView;
        }
    }
    public static class DataFragment extends Fragment {

        public DataFragment() {}

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View dataView = inflater.inflate(R.layout.fragment_data,
                    container, false);
            //TextView sectionBarView = (TextView) dataView.findViewById(R.id.section_label);
            //sectionBarView.setText("pups2");
            return dataView;
        }
    }
    public static class GraphFragment extends Fragment {

        public GraphFragment() {}

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_graph,
                    container, false);
            //TextView sectionBarView = (TextView) rootView.findViewById(R.id.section_label);
            //sectionBarView.setText("pups3");
            return rootView;
        }
    }
}

解决方案

Create the adapter:

class MyPagerAdapter extends FragmentPagerAdapter {
        public List<String> fragmentsA; 

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
            fragmentsA = fragments;s
        }

        @Override
        public Fragment getItem(int position) {
            //return MyFragment.newInstance();
            return Fragment.instantiate(context, fragmentsA.get(position));

        }

        @Override
        public CharSequence getPageTitle(int position) {
            //return CONTENT[position % CONTENT.length].toUpperCase();
            return mEntries.get(position % CONTENT.length).toUpperCase();
        }

        @Override
        public int getCount() {
           // return CONTENT.length;
            return mEntries.size();
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    }

Each fragment belongs to different classes.

So you have to define a fragment list (These go to the main FragmentActivity) :

static MyPagerAdapter adapter;

and fill it with the fragments:

fragments.add( ConnectionFragment.class.getName());
fragments.add( DataFragment.class.getName());
fragments.add(Tab3.class.getName());
//..etc

Then you have to add the fragments to the adapter like this:

 pager = (ViewPager)findViewById( R.id.viewpager );
 adapter = new MyPagerAdapter(getSupportFragmentManager());
 pager.setAdapter( adapter );

The MyPagerAdaper will go through all the fragments contained by the fragments list, then it will instantiate each of them.

这篇关于如何使用FragmentPagerAdapter有标签具有不同的内容?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆