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