gpt4 book ai didi

android - 刷新 SwipeRefreshLayout 时,不会立即提交(不会发生)显示和隐藏 fragment

转载 作者:搜寻专家 更新时间:2023-11-01 08:43:49 24 4
gpt4 key购买 nike

所以基本上我正在做的工作与 Instagram 应用程序非常相似,其中有许多选项卡,用户可以毫不延迟地切换到任何选项卡,无论发生什么事情,例如刷新、重新加载、等等。它还使用后退按钮返回到上一个保留的选项卡。

为了实现这一点,我使用了 FragmentManagerFragmentTransaction 来显示和隐藏代表每个选项卡的每个 fragment 。我没有使用 replaceattach/detach 因为它们会破坏前一个选项卡的 View 层次结构。

除了显示和隐藏 fragment 未提交(我非常怀疑这是一个正确的词,但到目前为止,这就是我对流程的理解。),或者不会立即发生,我的实现工作得很好 SwipeRefreshLayout 刷新添加到 FragmentManager 的 fragment (要隐藏)时要晚于要显示的 fragment

我的实现遵循这些规则。假设我们有 4 个选项卡,我的 MainActivity 显示第一个选项卡,比如 FirstFragment,用户选择第二个选项卡,SecondFragment。因为以前从未添加过 SecondFragment,所以我使用 FragmentTransaction.add 将它添加到 FragmentManager 并隐藏 FirstFragment使用 FragmentTransaction.hide。如果用户再次选择第一个选项卡,因为 FirstFragment 之前已添加到 FragmentManager,它不会添加,只会显示 FirstFragment 并隐藏第二个 fragment 。在这两个选项卡之间进行选择可以顺利进行。

但是当用户“刷新”SecondFragmentSwipeRefreshLayout 并选择第一个选项卡时,FragmentTransaction 等待SecondFragment 的刷新完成并提交(?)实际事务。奇怪的是,从 FirstFragment 的刷新到 SecondFragment,事务立即以相反的方式提交。

因为这是按添加到 FragmentManager 的顺序发生的,所以我怀疑添加顺序会以某种方式影响 fragment 的回栈,并且可能存在诸如 UI 线程优先级之类的东西,因此它会强制 fragment 事务进行在稍后添加的 fragment 的 UI 转换完成后发生。但我只是没有足够的线索来解决这个问题。我已经尝试在 FragmentTransaction 上附加/分离和返回堆栈,但无法解决问题。我已经尝试了 FragmentTransaction.commitFragmentTransaction.commitAllowingStateLoss 但都没有解决问题。

这些是我的 MainActivity 的示例代码。

private ArrayList<Integer> mFragmentsStack; // This is simple psuedo-stack which only stores
// the order of fragments stack to collaborate
// when back button is pressed.
private ArrayList<Fragment> mFragmentsList;

@Override
protected void onCreate() {
mFragmentsStack = new ArrayList<>();
mFragmentsList = new ArrayList<>();
mFragmentsList.add(FirstFragment.newInstance());
mFragmentsList.add(SecondFragment.newInstance());
mFragmentsList.add(ThirdFragment.newInstance());
mFragmentsList.add(FourthFragment.newInstance());
mMainTab = (MainTab) findViewById(R.id.main_tab);
mMainTab.setOnMainTabClickListener(this);

int currentTab = DEFAULT_TAB;

mFragmentsStack.add(currentTab);
getSupportFragmentManager().beginTransaction().add(R.id.main_frame_layout,
mFragmentsList.get(currentTab), String.valueOf(currentTab)).commit();
mMainTab.setCurrentTab(currentTab);
}

// This is custom interface.
@Override
public void onTabClick(int oldPosition, int newPosition) {
if (oldPosition != newPosition) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();

// First hide the old tab.
fragmentTransaction.hide(mFragmentsList.get(oldPosition));

// Recalculate the fragment stack.
if (mFragmentsStack.contains(newPosition)) {
mFragmentsStack.remove((Integer) newPosition);
}
mFragmentsStack.add(newPosition);

// Add new fragment if it's not added before, or show new fragment which was already hidden.
Fragment fragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(newPosition));
if (fragment != null) {
fragmentTransaction.show(fragment);
} else {
fragmentTransaction.add(R.id.main_frame_layout, mFragmentsList.get(newPosition),
String.valueOf(newPosition));
}

// Commit the transaction.
fragmentTransaction.commitAllowingStateLoss();
}
}

// It mimics the tab behavior of Instagram Android application.
@Override
public void onBackPressed() {
// If there's only one fragment on stack, super.onBackPressed.
// If it's not, then hide the current fragment and show the previous fragment.
int lastIndexOfFragmentsStack = mFragmentsStack.size() - 1;
if (lastIndexOfFragmentsStack - 1 >= 0) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.hide(mFragmentsList.get(mFragmentsStack.get(lastIndexOfFragmentsStack)));
fragmentTransaction.show(mFragmentsList.get(mFragmentsStack.get(lastIndexOfFragmentsStack - 1)));
fragmentTransaction.commitAllowingStateLoss();
mMainTab.setCurrentTab(mFragmentsStack.get(lastIndexOfFragmentsStack - 1));
mFragmentsStack.remove(lastIndexOfFragmentsStack);
} else {
super.onBackPressed();
}
}

最佳答案

只是遇到了同样的问题,唯一不同的是——我在单击工具栏按钮时切换 fragment 。我设法摆脱了覆盖 onHiddenChanged 的​​重叠 fragment :

@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {
yourSwipeRefreshLayout.setRefreshing(false);
}
}

关于android - 刷新 SwipeRefreshLayout 时,不会立即提交(不会发生)显示和隐藏 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30315991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com