Search code examples
androidandroid-fragmentsandroid-tabs

Adding Tabs using Fragments


I am trying to make a simple project for adding tabs using fragments.I want to add three fragments in the tabs. But I am getting some errors in code. My fragment getItem method is showing some errors. I don't know how to correct them. My MainActivity code is:

    package com.example.tabs;



    public class MainActivity extends android.support.v4.app.FragmentActivity {
    ViewPager viewpager=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    viewpager = (ViewPager) findViewById(R.id.pager);
    FragmentManager manager = getSupportFragmentManager();
    viewpager.setAdapter(new MyAdapter(manager));
    FragmentA fragA = new FragmentA();
    FragmentB fragB = new FragmentB();
    FragmentC fragC = new FragmentC();
    }


    @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;
    }

    class MyAdapter extends FragmentPagerAdapter{

    public MyAdapter(FragmentManager fm) {
        super(fm);
        // TODO Auto-generated constructor stub
    }



    @Override
    public Fragment getItem(int a) {
        if (a == 0){
            FragmentA fragment = new FragmentA();
        }
        if (a == 1){
            FragmentB fragment = new FragmentB();
        }
        if (a == 2){
            FragmentC fragment = new FragmentC();
        }
        return fragment;

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 3;
    }

    }

    }

XML file of this is:

<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">

</android.support.v4.view.ViewPager>

Solution

  • I'm not sure but I think it's because you initialized the fragment var regarding each fragments. As you said: "fragment word in getItem are underlined by red. It says change fragment to Fragment", this happens because the getItem method needs to return a Fragment Object:

    public Fragment getItem() { ... } 
    

    Then, when you declare and initialize the var, you set it to each fragments individually and without returning a Fragment. Indeed, you return FragmentA, FragmentB or FragmentC when you declare this:

    FragmentA fragment = new FragmentA(); // same for others
    return fragment;
    

    It might be better to return a global var which can equal to FragmentA, FragmentB or FragmentC.

    See this:

    @Override
    public Fragment getItem(int a) {
        // declare Fragment var
        Fragment fragment = null;
        switch (a){
            case 0:
                // use and init this var
                fragment = new FragmentA();
                break;
            case 1:
                fragment = new FragmentB();
                break;
            case 2:
                fragment = new FragmentC();
                break;
        }
        // return it
        return fragment;
    }  
    

    BTW, I changed if/else condition to a switch, there is no difference with if/else anyway.

    You can also avoid to use a var and return directly the related fragment, as follows:

    @Override
    public Fragment getItem(int a) {
        switch (a){
            case 0:
                // return the related fragment
                return new FragmentA();
                break;
            case 1:
                return new FragmentB();
                break;
            case 2:
                return new FragmentC();
                break;
        }
    }