2013-09-24 57 views
0

我已經使用Viewpager創建了swipable選項卡,但出於某種原因,我無法獲得正確的選項卡名稱以顯示在我的xml文件中。繼承人的類:Android Tabs + ViewPager:無法獲得正確的名稱顯示在標籤上

dashboard.xml(選項卡中顯示的XML):

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

添加:

當我跑我的應用程序在模擬器上,tabhost不顯示在我的儀表板中。正如你所看到here

添加:

這裏是我的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); 
} 
} 

而且,我只注意到這一點,但我會如何改變編碼,使我的標籤去其他班?

新增: 我現在得到這七個錯誤:

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 

這裏是我的更新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; 

} 
} 

這裏是我的更新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); 

} 

} 

我試着將我的FragmentTab更改爲我正在使用的類(如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); 
} 
} 

但是我得到了一個錯誤循環。 ) 我完全不明白如何解決「fm」錯誤。 我被告知,在我的CreatePic和其他類中,他們必須擴展Fragment,這是真的嗎?如果是這樣,是否有更簡單的方法來做到這一點,以便我不必重寫所有的編碼來適應這種情況?

回答

2

嘗試使用下面的代碼構建ViewPager選項卡。在ViewPager上滑動將顯示不同的片段。

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

} 

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

+0

有沒有一種方法,我可以做到這一點,而不SH erlock行動酒吧? ()因爲我還沒有安裝它) – user2755945

+0

執行以下操作:將SherlockFragmentActivity更改爲FragmentActivity,將getSupportActionBar()更改爲getActionBar(),將getSupportFragmentManager()更改爲getFragmentManager(),將SherlockFragment更改爲Fragment並更改android:theme = 「@風格/主題。Sherlock「to android:theme =」@ style/AppTheme「 –

+0

Thanks,I'll let you know if if work。 – user2755945

相關問題