2015-10-05 36 views
0

我正在研究Android應用程序,我想在具有不同內容的頁面之間滑動。爲此,我使用ViewPager。這對我來說是新的,因此我以this project爲例。我的問題是我不知道如何將內容放在不同的頁面上。簡單地說 - 我如何在第一頁上製作一些文字,在另一張 - 圖像上和第三頁上 - 一個按鈕? 它是通過不同的佈局或其他方式實現的嗎?如何在ViewPager中的佈局之間切換

這裏是我的代碼使用方法:

SampleTabsStyled.java

public class SampleTabsStyled extends FragmentActivity { 
private static final String[] CONTENT = new String[] { "Recent", "Artists", "Albums", "Songs", "Playlists", "Genres" }; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.simple_tabs); 

    FragmentPagerAdapter adapter = new GoogleMusicAdapter(getSupportFragmentManager()); 

    ViewPager pager = (ViewPager)findViewById(R.id.pager); 
    pager.setAdapter(adapter); 

    TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator); 
    indicator.setViewPager(pager); 
} 

class GoogleMusicAdapter extends FragmentPagerAdapter { 
    public GoogleMusicAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return TestFragment.newInstance(CONTENT[position % CONTENT.length]); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return CONTENT[position % CONTENT.length].toUpperCase(); 
    } 

    @Override 
    public int getCount() { 
     return CONTENT.length; 
    } 


    } 
} 

simple_tabs.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <com.viewpagerindicator.TabPageIndicator 
     android:id="@+id/indicator" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     /> 
    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     /> 

</LinearLayout> 

[更新]

我寫簡單TestFragment。 java,它應該顯示不同的佈局。 的問題是,在線路return TestFragment.newInstance();,我得到這個錯誤

The method newInstance() is undefined for the type TestFragment 

TestFragment.java

public class TestFragment extends Fragment { 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.activity_sideview, null);  
    } 
} 

而這裏的MainActivity.java

public class MainActivity extends FragmentActivity { 
    private static final String[] CONTENT = new String[] { "Recent", "Artists", "Albums", "Songs", "Playlists", "Genres" }; 

    TestFragment TestFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     TestFragment = new TestFragment(); 


     FragmentPagerAdapter adapter = new GoogleMusicAdapter(getSupportFragmentManager()); 

     ViewPager pager = (ViewPager)findViewById(R.id.pager); 
     pager.setAdapter(adapter); 

     TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator); 
     indicator.setViewPager(pager); 
    } 

    class GoogleMusicAdapter extends FragmentPagerAdapter { 
     public GoogleMusicAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch(position) { 
      case 0: 
       return TestFragment.newInstance(); 
      case 1: 

      /*case 1: 
       return ImageFragment.newInstance(); 
      case 2: 
       return ButtonFragment.newInstance(); */ 
     } 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return CONTENT[position % CONTENT.length].toUpperCase(); 
     } 

     @Override 
     public int getCount() { 
      return CONTENT.length; 
     } 
    } 
} 

回答

1

,你應該做的是從延伸的類分段。 然後你重寫返回視圖的oncreateview方法。 在那裏你可以膨脹一個自定義例如在第一次你膨脹有文字的佈局第二次你膨脹有圖像和佈局的佈局......

知道哪個佈局應該膨脹你可以傳遞位置到新實例方法。

,並在片段類,你可以有一個字段,顯示page.you的位置初始化它在新的實例,並在適配器的每一個的getItem使用它oncreateview

你做的一個新實例片段類,您可以使用片段的位置對其進行定製。

希望這是有益的

編輯:

這是您的片段類

public class MyFragment extends android.support.v4.app.Fragment { 

public int position; 

public static MyFragment newInstance(int position){ 
    MyFragment myFragment = new MyFragment(); 
    myFragment.setPosition(position); 
    return new MyFragment(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View fView; 
    if(position == 0){ 
     fView = inflater.inflate(R.layout.text_layout); 
    }else if(position == 1){ 
     fView = inflater.inflate(R.layout.image_layout); 
    }else{ 
     fView = inflater.inflate(R.layout.button_layout); 
     Button b = fView.findViewById(R.id.button) 
    } 
    return fView; 
} 

public void setPosition(int position) { 
    this.position = position; 
} 
} 

,現在叫的newInstance這樣MyFragment.newInstance(positoin);

+0

能否請您解釋一下更詳細或發送一個鏈接的教程?坦率地說,我不明白怎麼做你說的一半。 –

+0

請檢查更新 –

1

解決你的問題的關鍵是getItem(int position)方法,使用相同的片段的每一頁(TestFragment):

@Override 
public Fragment getItem(int position) { 
    return TestFragment.newInstance(CONTENT[position % CONTENT.length]); 
} 

而是這種方法,您可以使用分離片段的每個頁面(例如片段與文字,帶圖片的片段等)

和你getItem(int position)方法應該是這樣的:

@Override 
public Fragment getItem(int position) { 
    switch(position) { 
     case 0: 
      return TextFragment.newInstance(); 
     case 1: 
      return ImageFragment.newInstance(); 
     case 2: 
      return ButtonFragment.newInstance(); 
    } 
} 
+0

請檢查更新 –

+0

@OleksandrFirsov其實你選擇不是我的方法:)但是,你確定你的片段類有'newInstance()'方法''公共靜態'訪問。你可以閱讀關於'newInstance()'模式[這裏](http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html) –

0

getItem應該返回Fragment(這是一個頁)在指定的位置。我不確定你的代碼打算做什麼?

@Override 
public Fragment getItem(int position) { 
    return TestFragment.newInstance(CONTENT[position % CONTENT.length]); 
} 

而是應該創建爲每個頁面片段,並將其分配給一個位置,例如:

@Override 
public Fragment getItem(int position) { 
    switch(position) 
    { 
     case 0: 
      return new MyFragment(); 
     case 1: 
      return new MyFragment1(); 
     case 2: 
      return new MyFragment2(); 
     //... 
    } 
} 
+0

請檢查更新 –

相關問題