2013-09-24 1 views
0

ViewPager를 사용하여 스 와이프 가능한 탭을 만들었지 만, 어떤 이유로 내 XML 파일에 올바른 탭 이름을 표시 할 수 없습니다. . Heres는 클래스 :Android 탭 + 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

추가 된을 볼 수 있듯이 내 탭이 다른 클래스에 갈 수 있도록 내가 코딩을 변경 얼마나

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

또한, 난 그냥하지만,이 눈치, 다음은

내 PageAdapter입니다 ?

ADDED : 지금이 일곱 오류를 얻을 :

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됩니다 : I가

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

} 

} 

시도 내 FragmentTabs를 사용중인 클래스로 변경하십시오 (예 : 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

내가없이이 작업을 수행 할 수있는 방법이 있나요 쉬 실수를 저지른 행동 바? (아직 설치하지 않았기 때문에 궁금합니다) – user2755945

+0

SherlockFragmentActivity를 FragmentActivity로 변경하고 getSupportActionBar()를 getActionBar()로 변경하고 getSupportFragmentManager()를 getFragmentManager()로 변경하고 SherlockFragment를 Fragment로 변경 한 다음 android : theme = "@ 스타일/테마.Sherlock "to android : theme ="@ style/AppTheme " –

+0

고마워요!이게 효과가 있다면 알려주지. – user2755945