更新:我可以使用以下布局在Viewpager中实现3个文本视图:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="view 1"/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="view 2"/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="view 3"/>
</android.support.v4.view.ViewPager>
</LinearLayout>
我想为这3个视图实现ViewPager。我希望在单个xml文件中有viewpager和那3个视图。每个页面都包含每个文本视图。我看过一些例子,但每个页面都使用单独的xml布局文件实现。
如何在单个xml文件中为这3个视图实现viewpager。如果可能,请提供示例代码或示例。
答案 0 :(得分:51)
您可以使用嵌套子视图的单个XML布局。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/page_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:text="PAGE ONE IN"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#fff"
android:textSize="24dp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/page_two"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:text="PAGE TWO IN"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#fff"
android:textSize="24dp"/>
</LinearLayout>
</android.support.v4.view.ViewPager>
</LinearLayout>
但是......您还需要使用适配器处理此问题。在这里,我们返回查找的视图ID,而不会膨胀任何其他布局。
class WizardPagerAdapter extends PagerAdapter {
public Object instantiateItem(View collection, int position) {
int resId = 0;
switch (position) {
case 0:
resId = R.id.page_one;
break;
case 1:
resId = R.id.page_two;
break;
}
return findViewById(resId);
}
@Override
public int getCount() {
return 2;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == ((View) arg1);
}
}
// Set the ViewPager adapter
WizardPagerAdapter adapter = new WizardPagerAdapter();
ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);
我的问题是......这里的一些大师可以教我如果ViewPager可以从XML读取孩子并自动构建页面而不使用instantiateItem()吗?
答案 1 :(得分:2)
如何在单个xml文件中为这3个视图实现viewpager。
抱歉,但这是不可能的。
答案 2 :(得分:2)
此答案将显示在布局内设置ViewPager页面的优化和托管方式。
首先制作两页布局XML @if(auth()->user()){{auth()->user()->name}}@endif
和layout_page_1.xml
。
现在将所有页面布局包括在父布局layout_page_2.xml
中。
ViewPager
现在从您的代码中,以简单的步骤设置适配器
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/page_one"
layout="@layout/layout_page_1" />
<include
android:id="@+id/page_two"
layout="@layout/layout_page_2" />
</androidx.viewpager.widget.ViewPager>
仅此而已!您只需为所有ViewPagers使用通用适配器即可。
CommonPagerAdapter.java类
// find views by id
ViewPager viewPager = findViewById(R.id.viewpager);
CommonPagerAdapter adapter = new CommonPagerAdapter();
// insert page ids
adapter.insertViewId(R.id.page_one);
adapter.insertViewId(R.id.page_two);
// attach adapter to viewpager
viewPager.setAdapter(adapter);
最好使用片段而不是视图。您应该创建片段并使用public class CommonPagerAdapter extends PagerAdapter {
private List<Integer> pageIds = new ArrayList<>();
public void insertViewId(@IdRes int pageId) {
pageIds.add(pageId);
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
return container.findViewById(pageIds.get(position));
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
@Override
public int getCount() {
return pageIds.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
}
来维护堆栈,生命周期和状态。您可以看到@this answer来获得使用FragmentStatePagerAdapter
的完整代码。
答案 3 :(得分:1)
那是不可能的。你可以这样做
<?xml version="1.0" encoding="utf-8"?>
<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="match_parent" />
然后创建单独的xml文件并像这样执行。例如:我将使用xml文件名是ios_frag.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50sp"/>
</LinearLayout>
答案 4 :(得分:1)
如果有人遇到同样的问题,我已经使用适配器解决了这个问题,该适配器从您传递给它的任意视图组中提取页面视图。
package com.packagename;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
public class ViewGroupPagerAdapter extends PagerAdapter {
public ViewGroupPagerAdapter(ViewGroup viewGroup) {
while (viewGroup.getChildCount() > 0) {
views.add(viewGroup.getChildAt(0));
viewGroup.removeViewAt(0);
}
}
private List<View> views = new ArrayList<View>();
@Override
public Object instantiateItem(ViewGroup parent, int position) {
View view = views.get(position);
ViewPager.LayoutParams lp = new ViewPager.LayoutParams();
lp.width = ViewPager.LayoutParams.FILL_PARENT;
lp.height = ViewPager.LayoutParams.FILL_PARENT;
view.setLayoutParams(lp);
parent.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup parent, int position, Object object) {
View view = (View) object;
parent.removeView(view);
}
@Override
public int getCount() {
return views.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
用法:
ViewPager viewPager=findViewById(...); // Retrieve the view pager
viewPager.setAdapter(new ViewGroupPagerAdapter(findViewById(R.id.id_of_your_view_group_where_you_store_the_pages)));
答案 5 :(得分:1)
您可以继承ViewPager
并覆盖onInflate
此外,您将在布局编辑器中预览第一个ViewPager页面
所有视图都保存在内存中,因此出于性能原因,您应该只使用少量页面。
@Override protected void onFinishInflate() {
int childCount = getChildCount();
final List<View> pages = new ArrayList<>(childCount);
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
Class<?> clazz = child.getClass();
if (clazz.getAnnotation(DecorView.class) == null) {
pages.add(child);
}
}
for (View page : pages) {
removeView(page);
}
setAdapter(new PagerAdapter() {
@Override public int getCount() {
return pages.size();
}
@Override public Object instantiateItem(ViewGroup container, int position) {
container.addView(pages.get(position));
return position;
}
@Override public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(pages.get((Integer)object));
}
@Override public boolean isViewFromObject(View view, Object object) {
return pages.get((Integer)object) == view;
}
});
super.onFinishInflate();
}
答案 6 :(得分:1)
viewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
viewPager.setAdapter(new MyPagerAdapter(rootView));
viewPager.setOffscreenPageLimit(3); //or whatever you like
它缓存它并完美显示。
答案 7 :(得分:0)
在xml布局文件中添加
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
创建3个Fragment
并为每个片段添加每个TextView
。然后创建一个子类PagerAdapter
可以找到一个很好的例子here
答案 8 :(得分:-3)
简单地说:在你的文件中添加一个ViewPager并放入你的3 TextView ......