- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以基本上我正在做的工作与 Instagram 应用程序非常相似,其中有许多选项卡,用户可以毫不延迟地切换到任何选项卡,无论发生什么事情,例如刷新、重新加载、等等。它还使用后退按钮返回到上一个保留的选项卡。
为了实现这一点,我使用了 FragmentManager
和 FragmentTransaction
来显示和隐藏代表每个选项卡的每个 fragment 。我没有使用 replace
或 attach
/detach
因为它们会破坏前一个选项卡的 View 层次结构。
除了显示和隐藏 fragment 未提交(我非常怀疑这是一个正确的词,但到目前为止,这就是我对流程的理解。),或者不会立即发生,我的实现工作得很好 当 SwipeRefreshLayout
刷新添加到 FragmentManager
的 fragment (要隐藏)时要晚于要显示的 fragment 。
我的实现遵循这些规则。假设我们有 4 个选项卡,我的 MainActivity 显示第一个选项卡,比如 FirstFragment,用户选择第二个选项卡,SecondFragment。因为以前从未添加过 SecondFragment,所以我使用 FragmentTransaction.add
将它添加到 FragmentManager
并隐藏 FirstFragment使用 FragmentTransaction.hide
。如果用户再次选择第一个选项卡,因为 FirstFragment 之前已添加到 FragmentManager
,它不会添加,只会显示 FirstFragment 并隐藏第二个 fragment 。在这两个选项卡之间进行选择可以顺利进行。
但是当用户“刷新”SecondFragment 的SwipeRefreshLayout
并选择第一个选项卡时,FragmentTransaction
等待SecondFragment 的刷新完成并提交(?)实际事务。奇怪的是,从 FirstFragment 的刷新到 SecondFragment,事务立即以相反的方式提交。
因为这是按添加到 FragmentManager
的顺序发生的,所以我怀疑添加顺序会以某种方式影响 fragment 的回栈,并且可能存在诸如 UI 线程优先级之类的东西,因此它会强制 fragment 事务进行在稍后添加的 fragment 的 UI 转换完成后发生。但我只是没有足够的线索来解决这个问题。我已经尝试在 FragmentTransaction
上附加/分离和返回堆栈,但无法解决问题。我已经尝试了 FragmentTransaction.commit
和 FragmentTransaction.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/
我正在尝试 react-native run-android 有这个问题吗?? Could not resolve all files for configuration ':react-native
关于我的环境的信息 Mac OS 大苏尔:11.4 VS for Mac:8.10.6(内部版本 10) Xamarin.Android:11.3.0.4 SDK 工具版本:26.1.1 SDK平台工
我正在开发一个 Android 应用程序。我将 listview 与 SwipefreshLayout 一起使用。但是当我使用 SwipefreshLayout 刷新 ListView 时,加载圈永远
我的应用程序包含一个 SwipeRefreshLayout ,其中包含一个 listView 。该列表从服务器接收数据。因此,当获取数据并且正确填充列表时,滑动刷新可以工作,但是当数据未传递到列表并且
我在使用 SwipeRefreshLayout 时遇到了内存泄漏问题,想知道是否有任何方法可以通过解决方法来解决此问题? 在一个空项目中,以滑动布局作为主要 Activity 的根,如果你向下滑动,并
我尝试为现有的 ListView 实现 SwipeRefreshLayout,但每当我运行该程序时,即使我通过拉动刷新它,它也只显示一项。但是,刷新动画有效。相关代码如下: items = (
这个问题在这里已经有了答案: When I am scrolling up SwipeRefreshLayout refreshing my app (4 个答案) 关闭 3 年前。 我有一个带有
我正在我的应用程序中实现 SwipeRefreshLayout。我已成功实现 OnRefreshListener,并且能够正确刷新 ListView 项目。 我的问题是,如果我向下滑动,当 Swipe
fragment 的onCreateView方法内部: swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefresh
我有以下问题:我有很长的 ListView,但是当我向上滚动时会触发 onRefresh,而不是先滚动回顶部。我该如何解决这个问题? 我将以下 fragment 插入到 FrameLay
我有一个 SwipeRefreshLayout,其中包含用于聊天 Activity 的 RecyclerView。我将其底部限制在屏幕底部线性布局的顶部:
我在我的布局中使用了 SwipeRefreshLayout,我需要显示一个动画来调整已被下拉的距离。 到目前为止,我还没有找到任何方法来检测已拉动的实际距离。 SwipeRefreshListener
我喜欢新的 SwipeRefreshLayout!它看起来很棒,而且非常容易使用。但我想在两个方向上使用它。我有一个消息屏幕,我想通过从上到下滑动来加载旧消息,我想通过从下到上滑动来加载新消息。 这个
我正在使用支持库中的 SwipeRefreshListener。我正在从 AsyncTask 的 onPreExecute 和 onPostExecute 调用 setRefresh。然而,什么都没有
是否可以在不显示进度微调器的情况下执行 SwipeRefreshLayout 功能。现在,它的默认拉动刷新行为完美无缺地显示了 Progress 微调器和 onRefresh() 我隐藏了它。但我想将
我正在为 Google 支持库的 SwipeRefreshLayout 中的文档而苦苦挣扎。 当我使用 setOnRefreshListener 设置的回调接收到刷新调用时,我执行了我的操作,之后我发
有没有办法使用主题修改 SwipeRefreshLayout 中箭头的颜色? 我知道您可以通过编程方式使用此代码 public void setColorSchemeResources (int...
我已经实现了一个将 SwipeRefreshLayout 作为内容 View 的 fragment 。刷新动画在 onRefresh 时触发,但即使在从服务器检索数据后将 setRefreshing
我有一个向用户显示项目列表的 Activity ,它使用了分页库。我的问题是当用户向下滑动屏幕时我无法重新加载列表,以便它再次从服务器获取数据。 这是我的数据源工厂: public class Cou
我在我的 listView 中添加了一个“拉动刷新”,我还想在列表为空时添加一个空 View - 现在我收到了这个错误。我怎样才能使这项工作?如果我将 View 定位在 swipeRefresh 之外
我是一名优秀的程序员,十分优秀!