我被告知使用FragmentStateAdapter的createFranie覆盖来按索引获取当前片段。
这就是我的适配器的外观。
class AddRestaurantPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
FragmentStateAdapter(fragmentManager, lifecycle) {
private var fragments = listOf<Fragment>(
FragmentA.newInstance(),
FragmentB.newInstance(),
FragmentC.newInstance(),
FragmentD.newInstance()
)
override fun getItemCount() = 4
override fun createFragment(position: Int) =
fragments[position]
}
在我们在此活动/片段上强制使用onSaveInstance/OnRestoreInstance之前,这一切正常。
ViewPager2重新加载已经存在的片段,我们需要一种访问方法。FragmentStateAdapter类中的以下LOC证明了这一点
private void ensureFragment(int position) {
long itemId = getItemId(position);
if (!mFragments.containsKey(itemId)) {
// TODO(133419201): check if a Fragment provided here is a new Fragment
Fragment newFragment = createFragment(position);
newFragment.setInitialSavedState(mSavedStates.get(itemId));
mFragments.put(itemId, newFragment);
}
}
在活动/片段重新创建之后,您会发现this IF块永远不会执行,因为mFragments已经包含在收集活动之前添加的片段。
所以我想知道应该如何提取viewpager2中已经存在的片段
如果你看看这个方法,
/**
* @param holder that has been bound to a Fragment in the {@link #onBindViewHolder} stage.
*/
@SuppressWarnings("WeakerAccess") // to avoid creation of a synthetic accessor
void placeFragmentInViewHolder(@NonNull final FragmentViewHolder holder) {
Fragment fragment = mFragments.get(holder.getItemId());
if (fragment == null) {
throw new IllegalStateException("Design assumption violated.");
}
FrameLayout container = holder.getContainer();
View view = fragment.getView();
/*
possible states:
- fragment: { added, notAdded }
- view: { created, notCreated }
- view: { attached, notAttached }
combinations:
- { f:added, v:created, v:attached } -> check if attached to the right container
- { f:added, v:created, v:notAttached} -> attach view to container
- { f:added, v:notCreated, v:attached } -> impossible
- { f:added, v:notCreated, v:notAttached} -> schedule callback for when created
- { f:notAdded, v:created, v:attached } -> illegal state
- { f:notAdded, v:created, v:notAttached } -> illegal state
- { f:notAdded, v:notCreated, v:attached } -> impossible
- { f:notAdded, v:notCreated, v:notAttached } -> add, create, attach
*/
// { f:notAdded, v:created, v:attached } -> illegal state
// { f:notAdded, v:created, v:notAttached } -> illegal state
if (!fragment.isAdded() && view != null) {
throw new IllegalStateException("Design assumption violated.");
}
// { f:added, v:notCreated, v:notAttached} -> schedule callback for when created
if (fragment.isAdded() && view == null) {
scheduleViewAttach(fragment, container);
return;
}
// { f:added, v:created, v:attached } -> check if attached to the right container
if (fragment.isAdded() && view.getParent() != null) {
if (view.getParent() != container) {
addViewToContainer(view, container);
}
return;
}
// { f:added, v:created, v:notAttached} -> attach view to container
if (fragment.isAdded()) {
addViewToContainer(view, container);
return;
}
// { f:notAdded, v:notCreated, v:notAttached } -> add, create, attach
if (!shouldDelayFragmentTransactions()) {
scheduleViewAttach(fragment, container);
mFragmentManager.beginTransaction()
.add(fragment, "f" + holder.getItemId())
.setMaxLifecycle(fragment, STARTED)
.commitNow();
mFragmentMaxLifecycleEnforcer.updateFragmentMaxLifecycle(false);
} else {
if (mFragmentManager.isDestroyed()) {
return; // nothing we can do
}
mLifecycle.addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
if (shouldDelayFragmentTransactions()) {
return;
}
source.getLifecycle().removeObserver(this);
if (ViewCompat.isAttachedToWindow(holder.getContainer())) {
placeFragmentInViewHolder(holder);
}
}
});
}
}
此标签为“f”支架。getItemId()。
@Override
public long getItemId(int position) {
return position;
}
getItemId(int postion)
默认返回位置。但是如果您覆盖此方法。
int postionOfTheFragmentYouWantToGet=0;
Fragment page = getSupportFragmentManager().findFragmentByTag("f" + postionOfTheFragmentYouWantToGet);
我正在使用querySelector获得一个div元素,并且能够更改按钮名称,但是我还想插入一个span标记。好心的帮助。 我想把“标准”包装在span标记中。请帮帮忙。
如何使用JSoup(http://JSoup.org/)按标记获取元素? 但它输出:
问题内容: 如何从中获取URL片段标识符? 该javadocs中似乎没有提到它。 问题答案: 您无法以您想要的方式获得URL片段。 通常,浏览器不会将片段发送到服务器。可以通过使用网络协议分析器(例如tcpdump,Ethereal,Wireshark和Charles)来验证。 但是,您可以在JavaScript请求中将片段字符串作为GET / POST参数发送。要使用JavaScript获取值,
我在我的应用程序中使用片段,我是新手。有一个片段,我想在其中显示Google Map并想要获取它的对象,为此我在我的XML中有一个片段,我想在片段本身中膨胀它。当我试图膨胀地图视图时,它显示getSupportFragmentManager()的错误。 如何获取贴图对象,这是主要问题。我的XML如下所示:- 我想获取Google Map对象的片段如下:- 有人能帮我获取我的地图对象,以便我可以显示
我在网站上使用Yoast SEO进行SEO。在我的头文件中,我添加了
我有以下超文本标记语言片段: 有2个IMG标签,然后是ID标签。我正在尝试定位第一个IMG标签。我想从使用XPATH的ID标记开始。 我的XPath正在查找两个IMG标记。我只想要第一个IMG标签。我的XPath是: 如何使用祖先定位第一个IMG标签,因为我想从ID标签开始?