Search code examples
androidandroid-tabhostandroid-tabs

Android Tabs+ViewPager: Can't get right name to show up on tabs


I've created swipable tabs using a Viewpager but, for some reason, I can't get the correct tab names to show up in my xml file. Heres the classes:

dashboard.xml(the xml the tabs show up in):

 <TabHost  
android:id="@android:id/tabhost"  
android:layout_width="match_parent"  
android:layout_height="match_parent" >  
<LinearLayout  
 android:layout_width="match_parent"  
 android:layout_height="wrap_content"  
 android:orientation="vertical" >  
 <TabWidget  
   android:id="@android:id/tabs"  
   android:layout_width="match_parent"  
   android:layout_height="wrap_content" >  
 </TabWidget>  
 <FrameLayout  
   android:id="@android:id/tabcontent"  
   android:layout_width="match_parent"  
   android:layout_height="match_parent" >  
       <FrameLayout  
         android:id="@+id/tab1"  
         android:layout_width="match_parent"  
         android:layout_height="wrap_content"  
         android:visibility="gone" />  
       <FrameLayout  
         android:id="@+id/tab2"  
         android:layout_width="match_parent"  
         android:layout_height="wrap_content"  
         android:visibility="gone" />  
       <FrameLayout  
         android:id="@+id/tab3"  
         android:layout_width="match_parent"  
         android:layout_height="wrap_content"  
         android:visibility="gone" /> 
       <FrameLayout  
         android:id="@+id/tab4"  
         android:layout_width="match_parent"  
         android:layout_height="wrap_content"  
         android:visibility="gone" /> 
       <FrameLayout  
         android:id="@+id/tab5"  
         android:layout_width="match_parent"  
         android:layout_height="wrap_content"  
         android:visibility="gone" />  
  </FrameLayout>  
  <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="wrap_content"/>  
   </LinearLayout>  
 </TabHost>  

TabsViewPagerFragmentActivity.java:

package com.example.loginandregistration;

IMPORTS 
public class TabsViewPagerFragmentActivity extends Activity implements OnTabChangeListener,     OnPageChangeListener{  
 private TabHost host;  
 private ViewPager pager;  
 @Override  
 public void onCreate(Bundle savedInstanceState) {  
super.onCreate(savedInstanceState);  
setContentView(R.layout.dashboard);  
host = (TabHost)findViewById(android.R.id.tabhost);  
pager = (ViewPager) findViewById(R.id.pager);  

 host.setup();  
 TabSpec spec = host.newTabSpec("Create Pic");  
 spec.setContent(R.id.tab1);  
 spec.setIndicator("Create Pic");   
 host.addTab(spec);  

 spec = host.newTabSpec("Send Pic");  
 spec.setContent(R.id.tab2);  
 spec.setIndicator("Send Pic");  
 host.addTab(spec);  

 spec = host.newTabSpec("Create Folder");  
 spec.setContent(R.id.tab3);  
 spec.setIndicator("Create Folder");  
 host.addTab(spec); 

 spec = host.newTabSpec("Feedback");  
 spec.setContent(R.id.tab4);  
 spec.setIndicator("Feedback");  
 host.addTab(spec);  

 spec = host.newTabSpec("Logout");  
 spec.setContent(R.id.tab5);  
 spec.setIndicator("Log Out");  
 host.addTab(spec);  

 pager.setAdapter(new MyPageAdapter(this));  
 pager.setOnPageChangeListener(this);  
 host.setOnTabChangedListener(this);  
 }  
 @Override  
public void onTabChanged(String tabId){  
     int pageNumber = 0;  
     if(tabId.equals("tab1")){  
          pageNumber = 0;  
     } else if(tabId.equals("tab2")){  
          pageNumber = 1;  
     } else{  
          pageNumber = 2;  
     }  
     pager.setCurrentItem(pageNumber);  
}  
@Override  
public void onPageSelected(int pageNumber) {  
     host.setCurrentTab(pageNumber);  
}
@Override
public void onPageScrollStateChanged(int arg0) {
    // TODO Auto-generated method stub

}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
    // TODO Auto-generated method stub
}   
}  

ADDED ON:

When I run my application on the emulator, the tabhost doesn't show up in my dashboard. As you can see here

ADDED ON:

Here is my PageAdapter:

package com.example.loginandregistration;

IMPORTS

public class MyPageAdapter extends PagerAdapter {  
private Context ctx;  
public MyPageAdapter(Context ctx){  
     this.ctx = ctx;  
}  
@Override  
public Object instantiateItem(ViewGroup container, int position) {  
     TextView tView = new TextView(ctx);  
     position++;  
     tView.setText("Page number: " + position);  
     tView.setTextColor(Color.RED);  
     tView.setTextSize(20);  
     container.addView(tView);  
     return tView;  
}  
@Override  
public int getCount() {  
     return 3;  
}  
@Override  
public boolean isViewFromObject(View view, Object object) {  
     return (view == object);  
}  
}  

Also, I just noticed this but, how would I change the coding so that my tabs go to other classes?

ADDED: I now get these seven errors:

Description     Resource    Path    Location    Type
FragmentTab3 cannot be resolved to a type   MyPageAdapter.java  /LoginAndRegistration/src/com/example/loginandregistration  line 33 Java Problem
FragmentTab1 cannot be resolved to a type   MyPageAdapter.java  /LoginAndRegistration/src/com/example/loginandregistration  line 23 Java Problem
FragmentTab3 cannot be resolved to a type   MyPageAdapter.java  /LoginAndRegistration/src/com/example/loginandregistration  line 33 Java Problem
FragmentTab1 cannot be resolved to a type   MyPageAdapter.java  /LoginAndRegistration/src/com/example/loginandregistration  line 23 Java Problem
FragmentTab2 cannot be resolved to a type   MyPageAdapter.java  /LoginAndRegistration/src/com/example/loginandregistration  line 28 Java Problem
FragmentTab2 cannot be resolved to a type   MyPageAdapter.java  /LoginAndRegistration/src/com/example/loginandregistration  line 28 Java Problem
fm cannot be resolved to a variable TabsViewPagerFragmentActivity.java  /LoginAndRegistration/src/com/example/loginandregistration  line 47 Java Problem

Here is my updated MyPageAdapter:

package com.example.loginandregistration;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MyPageAdapter extends FragmentPagerAdapter {

// Declare the number of ViewPager pages
final int PAGE_COUNT = 3;

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

@Override
public Fragment getItem(int arg0) {
switch (arg0) {

// Open FragmentTab1.java
case 0:
    FragmentTab1 fragmenttab1 = new FragmentTab1();
    return fragmenttab1;

// Open FragmentTab2.java
case 1:
    FragmentTab2 fragmenttab2 = new FragmentTab2();
    return fragmenttab2;

// Open FragmentTab3.java
case 2:
    FragmentTab3 fragmenttab3 = new FragmentTab3();
    return fragmenttab3;
}
return null;
}

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

}
}

Here is my updated TabsViewFragmentActivity:

package com.example.loginandregistration;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.content.LocalBroadcastManager;
import com.example.loginandregistration.MyPageAdapter;

public class TabsViewPagerFragmentActivity extends FragmentActivity {

// Declare Variables
ActionBar mActionBar;
ViewPager mPager;
Tab tab;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Get the view from dashboard.xml
    setContentView(R.layout.dashboard);

    // Activate Navigation Mode Tabs
    mActionBar = getActionBar();
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // Locate ViewPager in activity_main.xml
    mPager = (ViewPager) findViewById(R.id.pager);

    // Capture ViewPager page swipes
    ViewPager.SimpleOnPageChangeListener ViewPagerListener = new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);
            // Find the ViewPager Position
            mActionBar.setSelectedNavigationItem(position);
        }
    };

    mPager.setOnPageChangeListener(ViewPagerListener);
    // Locate the adapter class called ViewPagerAdapter.java
    MyPageAdapter viewpageradapter = new MyPageAdapter(fm);
    // Set the View Pager Adapter into ViewPager
    mPager.setAdapter(viewpageradapter);

    // Capture tab button clicks
    ActionBar.TabListener tabListener = new ActionBar.TabListener() {

         @Override
         public void onTabSelected(Tab tab, FragmentTransaction ft) {
             // Pass the position on tab click to ViewPager
             mPager.setCurrentItem(tab.getPosition());
         }

         @Override
         public void onTabUnselected(Tab tab, FragmentTransaction ft) {
             // TODO Auto-generated method stub
         }

         @Override
         public void onTabReselected(Tab tab, FragmentTransaction ft) {
             // TODO Auto-generated method stub
         }
     };



    // Create first Tab
    tab = mActionBar.newTab().setText("Tab1").setTabListener(tabListener);
    mActionBar.addTab(tab);

    // Create second Tab
    tab = mActionBar.newTab().setText("Tab2").setTabListener(tabListener);
    mActionBar.addTab(tab);

    // Create third Tab
    tab = mActionBar.newTab().setText("Tab3").setTabListener(tabListener);
    mActionBar.addTab(tab);

}

}

I tried to change my FragmentTabs into my classes I am using (such as CreatePic.java:

package com.example.loginandregistration;


IMPORTS

public class CreatePic extends View {

//drawing path
private Path drawPath;
//drawing and canvas paint
private Paint drawPaint, canvasPaint;
//initial color
private int paintColor = 0xFF660000, paintAlpha = 255;
//canvas
private Canvas drawCanvas;
//canvas bitmap
private Bitmap canvasBitmap;
//brush sizes
private float brushSize, lastBrushSize;
//erase flag
private boolean erase=false;

public CreatePic(Context context, AttributeSet attrs){
    super(context, attrs);
    setupDrawing();
}

//setup drawing
private void setupDrawing(){

    //prepare for drawing and setup paint stroke properties
    brushSize = getResources().getInteger(R.integer.medium_size);
    lastBrushSize = brushSize;
    drawPath = new Path();
    drawPaint = new Paint();
    drawPaint.setColor(paintColor);
    drawPaint.setAntiAlias(true);
    drawPaint.setStrokeWidth(brushSize);
    drawPaint.setStyle(Paint.Style.STROKE);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);
    canvasPaint = new Paint(Paint.DITHER_FLAG);
}

//size assigned to view
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    drawCanvas = new Canvas(canvasBitmap);
}

//draw the view - will be called after touch event
@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    canvas.drawPath(drawPath, drawPaint);
}

//register user touches as drawing action
@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    //respond to down, move and up events
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        drawPath.moveTo(touchX, touchY);
        break;
    case MotionEvent.ACTION_MOVE:
        drawPath.lineTo(touchX, touchY);
        break;
    case MotionEvent.ACTION_UP:
        drawPath.lineTo(touchX, touchY);
        drawCanvas.drawPath(drawPath, drawPaint);
        drawPath.reset();
        break;
    default:
        return false;
    }
    //redraw
    invalidate();
    return true;

}

//update color
public void setColor(String newColor){
    invalidate();
    //check whether color value or pattern name
    if(newColor.startsWith("#")){
        paintColor = Color.parseColor(newColor);
        drawPaint.setColor(paintColor);
        drawPaint.setShader(null);
    }
    else{
        //pattern
        int patternID = getResources().getIdentifier(
                newColor, "drawable", "com.example.loginandregistration");
        //decode 
        Bitmap patternBMP = BitmapFactory.decodeResource(getResources(), patternID);
        //create shader
        BitmapShader patternBMPshader = new BitmapShader(patternBMP, 
                Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);  
        //color and shader
        drawPaint.setColor(0xFFFFFFFF);
        drawPaint.setShader(patternBMPshader);
    }
}

//set brush size
public void setBrushSize(float newSize){
    float pixelAmount = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
            newSize, getResources().getDisplayMetrics());
    brushSize=pixelAmount;
    drawPaint.setStrokeWidth(brushSize);
}

//get and set last brush size
public void setLastBrushSize(float lastSize){
    lastBrushSize=lastSize;
}
public float getLastBrushSize(){
    return lastBrushSize;
}

//set erase true or false
public void setErase(boolean isErase){
    erase=isErase;
    if(erase) drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    else drawPaint.setXfermode(null);
}

//start new drawing
public void startNew(){
    drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
    invalidate();
}

//return current alpha
public int getPaintAlpha(){
    return Math.round((float)paintAlpha/255*100);
}

//set alpha
public void setPaintAlpha(int newAlpha){
    paintAlpha=Math.round((float)newAlpha/100*255);
    drawPaint.setColor(paintColor);
    drawPaint.setAlpha(paintAlpha);
}
}

But I got a loop of errors. ) I completely don't understand how to fix the "fm" error. I was told that in my CreatePic and other classes that they have to extend Fragment, is this true? If so, is there an easier way to do this so that I don't have to rewrite all my coding to accomidate that?


Solution

  • Try structuring your ViewPager Tabs with the code below. On ViewPager swipe will show different fragments.

    activity_main.xml

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

    MainActivity.java

    public class MainActivity extends SherlockFragmentActivity {
    
        // Declare Variables
        ActionBar mActionBar;
        ViewPager mPager;
        Tab tab;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // Get the view from activity_main.xml
            setContentView(R.layout.activity_main);
    
            // Activate Navigation Mode Tabs
            mActionBar = getSupportActionBar();
            mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
            // Locate ViewPager in activity_main.xml
            mPager = (ViewPager) findViewById(R.id.pager);
    
            // Activate Fragment Manager
            FragmentManager fm = getSupportFragmentManager();
    
            // Capture ViewPager page swipes
            ViewPager.SimpleOnPageChangeListener ViewPagerListener = new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    super.onPageSelected(position);
                    // Find the ViewPager Position
                    mActionBar.setSelectedNavigationItem(position);
                }
            };
    
            mPager.setOnPageChangeListener(ViewPagerListener);
            // Locate the adapter class called ViewPagerAdapter.java
            ViewPagerAdapter viewpageradapter = new ViewPagerAdapter(fm);
            // Set the View Pager Adapter into ViewPager
            mPager.setAdapter(viewpageradapter);
    
            // Capture tab button clicks
            ActionBar.TabListener tabListener = new ActionBar.TabListener() {
    
                @Override
                public void onTabSelected(Tab tab, FragmentTransaction ft) {
                    // Pass the position on tab click to ViewPager
                    mPager.setCurrentItem(tab.getPosition());
                }
    
                @Override
                public void onTabUnselected(Tab tab, FragmentTransaction ft) {
                    // TODO Auto-generated method stub
                }
    
                @Override
                public void onTabReselected(Tab tab, FragmentTransaction ft) {
                    // TODO Auto-generated method stub
                }
            };
    
            // Create first Tab
            tab = mActionBar.newTab().setText("Tab1").setTabListener(tabListener);
            mActionBar.addTab(tab);
    
            // Create second Tab
            tab = mActionBar.newTab().setText("Tab2").setTabListener(tabListener);
            mActionBar.addTab(tab);
    
            // Create third Tab
            tab = mActionBar.newTab().setText("Tab3").setTabListener(tabListener);
            mActionBar.addTab(tab);
    
        }
    
    }
    

    ViewPagerAdapter.java

    public class ViewPagerAdapter extends FragmentPagerAdapter {
    
        // Declare the number of ViewPager pages
        final int PAGE_COUNT = 3;
    
        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public Fragment getItem(int arg0) {
            switch (arg0) {
    
            // Open FragmentTab1.java
            case 0:
                FragmentTab1 fragmenttab1 = new FragmentTab1();
                return fragmenttab1;
    
            // Open FragmentTab2.java
            case 1:
                FragmentTab2 fragmenttab2 = new FragmentTab2();
                return fragmenttab2;
    
            // Open FragmentTab3.java
            case 2:
                FragmentTab3 fragmenttab3 = new FragmentTab3();
                return fragmenttab3;
            }
            return null;
        }
    
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return PAGE_COUNT;
        }
    
    }
    

    Source : http://www.androidbegin.com/tutorial/android-actionbarsherlock-viewpager-tabs-tutorial/