Когда я запускаю действие, которое реализует viewpager, viewpager создал различные фрагменты. Я хочу использовать разные макеты для каждого фрагмента, но проблема в том, что viewpager показывает только два макета в максимуме (второй макет на всех оставшихся фрагментах после 1).
Вот код для SwipeActivity, который реализует viewpager:
public class SwipeActivity extends FragmentActivity
{
MyPageAdapter pageAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_swipe);
pageAdapter = new MyPageAdapter(getSupportFragmentManager());
ViewPager pager=(ViewPager)findViewById(R.id.pager);
pager.setAdapter(pageAdapter);
ActionBar bar = getActionBar();
bar.setDisplayHomeAsUpEnabled(true);
}
/**
* Custom Page adapter
*/
private class MyPageAdapter extends FragmentPagerAdapter
{
public MyPageAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public int getCount()
{
return 5;
}
@Override
public Fragment getItem(int position)
{
switch(position)
{
case 0: return new MyFragment();
case 1: return SecondFragment.newInstance("asdasd");
default : return RamFragment.newInstance("s");
}
}
}
}
Вот код для фрагментов
public class MyFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater paramLayoutInflater, ViewGroup paramViewGroup, Bundle paramBundle)
{
return paramLayoutInflater.inflate(R.layout.processorlayout, paramViewGroup, false);
}
}
Я использовал 5 таких фрагментов, каждый из которых имеет разную компоновку, но в окне просмотра отображается только 2 максимума.
РЕДАКТИРОВАТЬ : код для SecondFragment
public class SecondFragment extends Fragment
{
public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
public static final SecondFragment newInstance(String paramString)
{
SecondFragment f = new SecondFragment();
Bundle localBundle = new Bundle(1);
localBundle.putString("EXTRA_MESSAGE", paramString);
f.setArguments(localBundle);
return f;
}
@Override
public View onCreateView(LayoutInflater paramLayoutInflater, ViewGroup paramViewGroup, Bundle paramBundle)
{
return paramLayoutInflater.inflate(R.layout.motherboardlayout, paramViewGroup, false);
}
}
Ответы:
Поскольку это очень часто задаваемый вопрос, я хотел потратить время и усилия, чтобы подробно объяснить ViewPager с несколькими фрагментами и макетами. Ну вот.
ViewPager с несколькими фрагментами и файлами макетов
В этом случае у меня есть 3 класса фрагментов и разные файлы макетов для каждого класса. Для простоты макеты фрагментов отличаются только цветом фона . Конечно, любой файл макета может быть использован для фрагментов.
FirstFragment.java имеет оранжевый фоновый макет, SecondFragment.java имеет зеленый фоновый макет, а ThirdFragment.java имеет красный фоновый макет. Кроме того, каждый фрагмент отображает свой текст, в зависимости от того, из какого он класса и какого экземпляра.
MainActivity.java (инициализирует Viewpager и имеет адаптер для него как внутренний класс). Снова взгляните на импорт . Я использую
android.support.v4
пакет.activity_main.xml (файл MainActivitys .xml) - простой файл макета, содержащий только ViewPager, который заполняет весь экран.
Классы Fragment, FirstFragment.java import android.support.v4.app.Fragment;
first_frag.xml
SecondFragment.java
second_frag.xml
ThirdFragment.java
third_frag.xml
Конечный результат следующий:
Viewpager содержит 5 фрагментов, фрагменты 1 имеют тип FirstFragment и отображают макет first_frag.xml, фрагмент 2 имеет тип SecondFragment и отображает second_frag.xml, а фрагмент 3-5 имеет тип ThirdFragment, и все они отображают третий_фрагмент.xml ,
Выше вы можете увидеть 5 фрагментов, между которыми можно переключаться с помощью пальца влево или вправо. Конечно, одновременно может отображаться только один фрагмент.
Последний, но тем не менее важный:
Вместо передачи потенциальных параметров через конструктор, используйте
newInstance(...)
метод иBundle
для передачи параметров.Таким образом, если отсоединено и повторно присоединено, состояние объекта может быть сохранено через аргументы. Очень похоже на
Bundles
привязанность кIntents
.источник
Создайте массив Views и примените его к:
container.addView(viewarr[position]);
источник
Код для добавления фрагмента
Создайте xml-файл для каждого фрагмента, скажем, Fragment1, используйте frag_one.xml в качестве файла макета, используйте приведенный ниже код в java-файле Fragment1.
Позже вы можете внести необходимые исправления. Это сработало для меня.
источник
Базовый пример ViewPager
Этот ответ является упрощением документации , данного руководства и принятого ответа . Его цель - как можно быстрее приступить к работе
ViewPager
. Дальнейшие изменения могут быть сделаны после этого.XML
Добавьте макеты XML для основной деятельности и для каждой страницы (фрагмента). В нашем случае мы используем только один фрагментный макет, но если у вас есть разные макеты на разных страницах, тогда просто сделайте один для каждого из них.
activity_main.xml
fragment_one.xml
Код
Это код для основной деятельности. Включает в себя
PagerAdapter
иFragmentOne
как внутренние классы. Если они становятся слишком большими или вы используете их в других местах, вы можете переместить их в их отдельные классы.Законченный
Если вы скопировали и вставили три файла выше в свой проект, вы сможете запустить приложение и увидеть результат в анимации выше.
Продолжается
Есть довольно много вещей, которые вы можете сделать с помощью ViewPager. Смотрите следующие ссылки, чтобы начать:
источник
Это тоже хорошо:
источник
источник