Litho、ViewPager 和选项卡。如何使用 Litho 加载多个 Tab 的布局?
Litho, ViewPager and Tabs. How to load several Tab's layouts using Litho?
我正在尝试使用 Tabs 实现 ViewPager
,就像这样:
片段的布局是用 Facebook 的 Litho 呈现的,但这里的问题是只加载了第一项,在本例中为 'Look'。
见代码:
MainActivity
:
public class MainActivity extends AppCompatActivity {
private FragmentPagerAdapter mPagerAdapter;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
private final Fragment[] mFragments = new Fragment[]{
new Look(),
new Chat(),
new Flirt(),
new Friends(),
new Me(),
};
@Override
public Fragment getItem(int position) {
return mFragments[position];
}
@Override
public int getCount() {
return mFragments.length;
}
};
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOffscreenPageLimit(3);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setTabTextColors(Color.parseColor("#616161"), Color.parseColor("#ffffff"));
tabLayout.setupWithViewPager(mViewPager);
tabLayout.getTabAt(0).setText("LOOK");
tabLayout.getTabAt(1).setText("CHAT");
tabLayout.getTabAt(2).setText("FLIRT");
tabLayout.getTabAt(3).setText("ADD");
tabLayout.getTabAt(4).setText("ME");
findViewById(R.id.options).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(MainActivity.this, Options.class);
startActivity(i);
}
});
}
}
而且,为了简单起见,我们假设所有片段(Look、Chat 等)在其 onCreateView 方法中具有相同的代码:
public class Flirt extends Fragment {
public Flirt() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final ComponentContext contex = new ComponentContext(getContext());
final Component component = Text.create(contex)
.text("Hello World")
.textSizeDip(50)
.textColor(Color.GRAY)
.build();
return LithoView.create(contex, component);
}
}
创建MainActivity时希望加载5个fragment的视图,但只显示第一个,以第一个为准。我究竟做错了什么?我怎样才能得到它?
编辑:
如果我将 mViewPager.setOffscreenPageLimit(4)
更改为 (0)
,我会加载所有视图,但是一个接一个,并且每次聚焦时都会加载它们,这是不希望的。我想要得到的是五个页面一次加载,并且只加载一次。
称之为
public static boolean incrementalMountUsesLocalVisibleBounds = false;
在 viewPager 中填充视图之前。这应该可以解决问题。
工作原理
在classIncrementalMountHelper
中有如下一段代码:
// ViewPager does not give its child views any callbacks when it moves content onto the screen,
// so we need to attach a listener to give us the information that we require.
ViewParent viewParent = lithoView.getParent();
while (viewParent != null) {
if (ComponentsConfiguration.incrementalMountUsesLocalVisibleBounds
&& viewParent instanceof ViewPager) {
final ViewPager viewPager = (ViewPager) viewParent;
final IncrementalMountHelper.ViewPagerListener viewPagerListener =
new ViewPagerListener(mComponentTree, viewPager);
ViewCompat.postOnAnimation(
viewPager,
new Runnable() {
@Override
public void run() {
viewPager.addOnPageChangeListener(viewPagerListener);
}
});
mViewPagerListeners.add(viewPagerListener);
}
if (viewParent instanceof LithoView && ((LithoView) viewParent).doesOwnIncrementalMount()) {
lithoView.setDoesOwnIncrementalMount(true);
}
viewParent = viewParent.getParent();
}
viewPagerListener
这里负责调用componentTree.incrementalMountComponent();
这不会被调用,因为 ComponentsConfiguration.incrementalMountUsesLocalVisibleBounds
默认情况下为 false,您必须将其设置为 true。
我还不知道当您将其设置为 true 时所有其他效果会是什么,但是,将其设置为 true 会使您的 ViewPager 工作。
我正在尝试使用 Tabs 实现 ViewPager
,就像这样:
片段的布局是用 Facebook 的 Litho 呈现的,但这里的问题是只加载了第一项,在本例中为 'Look'。 见代码:
MainActivity
:
public class MainActivity extends AppCompatActivity {
private FragmentPagerAdapter mPagerAdapter;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
private final Fragment[] mFragments = new Fragment[]{
new Look(),
new Chat(),
new Flirt(),
new Friends(),
new Me(),
};
@Override
public Fragment getItem(int position) {
return mFragments[position];
}
@Override
public int getCount() {
return mFragments.length;
}
};
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOffscreenPageLimit(3);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setTabTextColors(Color.parseColor("#616161"), Color.parseColor("#ffffff"));
tabLayout.setupWithViewPager(mViewPager);
tabLayout.getTabAt(0).setText("LOOK");
tabLayout.getTabAt(1).setText("CHAT");
tabLayout.getTabAt(2).setText("FLIRT");
tabLayout.getTabAt(3).setText("ADD");
tabLayout.getTabAt(4).setText("ME");
findViewById(R.id.options).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(MainActivity.this, Options.class);
startActivity(i);
}
});
}
}
而且,为了简单起见,我们假设所有片段(Look、Chat 等)在其 onCreateView 方法中具有相同的代码:
public class Flirt extends Fragment {
public Flirt() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final ComponentContext contex = new ComponentContext(getContext());
final Component component = Text.create(contex)
.text("Hello World")
.textSizeDip(50)
.textColor(Color.GRAY)
.build();
return LithoView.create(contex, component);
}
}
创建MainActivity时希望加载5个fragment的视图,但只显示第一个,以第一个为准。我究竟做错了什么?我怎样才能得到它?
编辑:
如果我将 mViewPager.setOffscreenPageLimit(4)
更改为 (0)
,我会加载所有视图,但是一个接一个,并且每次聚焦时都会加载它们,这是不希望的。我想要得到的是五个页面一次加载,并且只加载一次。
称之为
public static boolean incrementalMountUsesLocalVisibleBounds = false;
在 viewPager 中填充视图之前。这应该可以解决问题。
工作原理
在classIncrementalMountHelper
中有如下一段代码:
// ViewPager does not give its child views any callbacks when it moves content onto the screen,
// so we need to attach a listener to give us the information that we require.
ViewParent viewParent = lithoView.getParent();
while (viewParent != null) {
if (ComponentsConfiguration.incrementalMountUsesLocalVisibleBounds
&& viewParent instanceof ViewPager) {
final ViewPager viewPager = (ViewPager) viewParent;
final IncrementalMountHelper.ViewPagerListener viewPagerListener =
new ViewPagerListener(mComponentTree, viewPager);
ViewCompat.postOnAnimation(
viewPager,
new Runnable() {
@Override
public void run() {
viewPager.addOnPageChangeListener(viewPagerListener);
}
});
mViewPagerListeners.add(viewPagerListener);
}
if (viewParent instanceof LithoView && ((LithoView) viewParent).doesOwnIncrementalMount()) {
lithoView.setDoesOwnIncrementalMount(true);
}
viewParent = viewParent.getParent();
}
viewPagerListener
这里负责调用componentTree.incrementalMountComponent();
这不会被调用,因为 ComponentsConfiguration.incrementalMountUsesLocalVisibleBounds
默认情况下为 false,您必须将其设置为 true。
我还不知道当您将其设置为 true 时所有其他效果会是什么,但是,将其设置为 true 会使您的 ViewPager 工作。