Я использую ViewPager
для пролистывания между ними Fragments
, но могу ли я пролистывать их ViewPager
между Views
простыми XML-макетами?
Это моя страница Adapter
для ViewPager, которая используется для перелистывания между фрагментами:
import java.util.List;
import com.app.name.fragments.TipsFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.view.ViewGroup;
public class PageAdapter extends FragmentPagerAdapter {
/**
*
*/
List<Fragment> fragments;
public PageAdapter(FragmentManager fm,List<Fragment> frags) {
super(fm);
fragments = frags;
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return TipsFragment.newInstance(0, 0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 4;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
super.destroyItem(container, position, object);
}
}
А это мой фрагмент подсказки:
public class TipsFragment extends Fragment
{
public static TipsFragment newInstance(int image,int content)
{
TipsFragment fragment = new TipsFragment();
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tip_layout, null);
return view;
}
}
Как я могу изменить свой код для работы с представлениями вместо фрагментов?
ViewPager
on,onDestroy
таким образом, в процессеonResume
активности не будет необходимости извлекать все 3 фрагмента, которые могут больше не доступны. Сразу хотел упомянуть одну из проблем.Ответы:
Вам нужно переопределить эти два метода, а не
getItem()
:источник
ViewPager
вообще не нужно выполнять приведение, поскольку вы имеете дело сViewGroup
интерфейсомИспользуйте этот пример
Вы можете использовать единый XML-макет для вложения дочерних представлений.
НО ... с этим тоже нужно справиться с помощью адаптера. Здесь мы возвращаем найденный идентификатор представления, не увеличивая какой-либо другой макет.
// Устанавливаем адаптер ViewPager
источник
return collection.findViewById(resId);
Если вы не хотите передавать экземпляр активности@Override public void destroyItem(ViewGroup container, int position, Object object) {}
Мы создали очень простой подкласс,
ViewPager
который мы иногда используем.Этому классу не нужен адаптер, поскольку он загружает представления из макета. Чтобы использовать его в своих проектах, просто используйте его вместо
android.support.v4.view.ViewPager
.Все навороты по-прежнему будут работать, но вам не нужно возиться с переходниками.
источник
onAttachedToWindow()
наonFinishInflate()
.Основываясь на предыдущих ответах, я создал следующий класс, чтобы добиться этого правильным и ясным способом (я надеюсь):
И вы должны установить это в своей деятельности:
Если файлы XML очевидны, view_screen.xml:
А ActivtyMain имеет следующий макет:
Большое спасибо Брайану и Николасу за ваш ответ. Надеюсь, я добавлю некоторую ясную информацию и выделю несколько хороших практик для этой функции.
источник
Я хотел бы подробнее рассказать об ответе @Nicholas, вы можете получить представления по идентификатору или, если они динамически добавлены, просто получить представление напрямую с учетом его позиции
источник
Я хотел бы добавить сюда свое решение. Учитывая , что вам не нужно фрагментов использования, вы можете создать
PagerAdapter
который привязываетсяviews
вместоfragments
кViewPager
.Расширить
PagerAdapter
вместоFragmentPagerAdapter
Теперь вам нужно определить три класса, которые будут возвращать значение
views
для расширения вviewpager
. АналогичноCpuView
вам будутMemoryView
иNetworkView
занятия. Каждый из них раздувает свои макеты.И, наконец, макет, который будет увеличиваться в каждом из представлений.
PS: Причина, по которой я написал этот ответ, заключается в том, что все представленные здесь решения, похоже, работают нормально, но они раздувают макеты в самом классе PagerAdapter. Для больших проектов становится сложно поддерживать, если в них много кода, связанного с раздутыми макетами. Теперь в этом примере все представления имеют отдельные классы и отдельные макеты. Так что проект можно легко поддерживать.
источник
да ... вы можете использовать View вместо Fragment в viewpager. Здесь вы можете найти пример целого, который поможет вам реализовать Viewpager без фрагмента. Просмотрите эту документацию.
https://www.bignerdranch.com/blog/viewpager-without-fragments/
источник