2013-11-09 4 views
2

Привет, я в Android и хочу попросить о помощи. Im создает новый проект в студии android, и я использую навигационные вкладки Action bar с viewpager. Android-студия генерирует этот код. Я знаю, что работаю с одним видом активности, но теперь я хочу изучить работу с макетами с вкладками. Мой вопрос: возможно ли сделать больше макетов с разными элементами внутри? Например, теперь у меня на каждом фрагменте есть одно текстовое представление, и когда я сажусь, я вижу любой текст на каждой странице. Но мне нужно, например, на странице (tab1) макет с textview, на tab2 мне нужен макет edittext, на tab3 мне нужен макет с изображением. Возможно ли это с этим? Потому что я могу изменить текст, но теперь у меня одинаковый макет для всех вкладок.Вкладки на панели действий с viewpager с различными макетами страниц

public class MainActivity extends ActionBarActivity implements ActionBar.TabListener { 

SectionsPagerAdapter mSectionsPagerAdapter; 
ViewPager mViewPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
     } 
    }); 

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
     actionBar.addTab(
       actionBar.newTab() 
         .setText(mSectionsPagerAdapter.getPageTitle(i)) 
         .setTabListener(this)); 
    } 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    // When the given tab is selected, switch to the corresponding page in 
    // the ViewPager. 
    mViewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

@Override 
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

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

    @Override 
    public Fragment getItem(int position) { 
     return PlaceholderFragment.newInstance(position + 1); 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     Locale l = Locale.getDefault(); 
     switch (position) { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(l); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(l); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(l); 
     } 
     return null; 
    } 
} 
public static class PlaceholderFragment extends Fragment { 
    private static final String ARG_SECTION_NUMBER = "section_number"; 
    public static PlaceholderFragment newInstance(int sectionNumber) { 
     PlaceholderFragment fragment = new PlaceholderFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public PlaceholderFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     TextView textView = (TextView) rootView.findViewById(R.id.section_label); 
     textView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER))); 
     return rootView; 
    } 
} 

}

+0

Это может помочь http://www.gadgetsaint.com/android/create-viewpager-tabs-android/#.WPuppVN97BI – ASP

ответ

7

В этом случае вы можете определить 3 отдельных фрагментов классов. После этого вы можете вернуть их надлежащим образом в getItem из ваших SectionsPagerAdapter:

@Override 
public Fragment getItem(int position) { 
    switch (position) { 
     case 0: 
      return new YourFragmentClass1(); 
     case 1: 
      return new YourFragmentClass2(); 
     case 2: 
      return new YourFragmentClass3(); 
    } 
} 
+0

Умение делиться кодом для getItem на SectionPagerAdapter? – CodeGuru

1

Чтобы уточнить ответ Шимона в.

Шаг 1 Удалить внутренний класс PlaceHolderFragment Шаг 2: Создать классы фрагментов с соответствующими раскладками. Например, ImageViewFragment (который, конечно, расширяет фрагмент), а затем image_view_fragment_layout. Этап 3 Есть ImageViewFragmentonCreateView Способ надувания image_view_fragment_layout.

public ImageViewFragment extends Fragment { 
    ... 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.image_view_fragment_layout, 
                container, false); 
    return rootView; 
    } 

Выполните следующие шаги для того, чтобы добавить столько вкладок.

Затем в методе getItem() следует ответ Шимона. Помните, что вкладка, которую вы хотите отобразить первым, будет находиться в позиции 0 и так далее.

более важно, что один, в методе GetCount:

@Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 3; 
    } 

число, возвращаемое должно отражать количество вкладок, которые вы добавили.

Смежные вопросы