相关疑难解决方法(0)

Android片段和动画

你应该如何实现那种例如Honeycomb Gmail客户端使用的滑动?

可以TransactionManager通过添加和删除片段自动处理这个,由于模拟器是幻灯片,所以很难测试这个:)

android android-fragments android-3.0-honeycomb

260
推荐指数
4
解决办法
23万
查看次数

Gmail三片段动画场景的完整工作示例?

TL; DR:我正在寻找一个完整的工作样本,我将其称为"Gmail三片段动画"场景.具体来说,我们想从两个片段开始,如下所示:

两个片段

在一些UI事件(例如,点击片段B中的某些内容)时,我们希望:

  • 片段A从屏幕向左滑动
  • 片段B滑动到屏幕的左边缘并收缩以占据片段A腾出的点
  • 片段C从屏幕右侧滑入并占据片段B腾出的位置

并且,在按下BACK按钮时,我们希望反转这组操作.

现在,我已经看到了很多部分实现; 我将在下面回顾其中的四个.除了不完整之外,他们都有自己的问题.


@Reto迈尔促成这种普遍的回答相同的基本问题,表明你会使用setCustomAnimations()一个FragmentTransaction.对于双片段场景(例如,您最初只看到片段A,并希望使用动画效果将其替换为新的片段B),我完全同意.然而:

  • 由于您只能指定一个"in"和一个"out"动画,我无法看到如何处理三片段场景所需的所有不同动画
  • <objectAnimator>他的代码示例使用像素的硬连线的位置,这似乎是不切实际给出不同的屏幕尺寸,但setCustomAnimations()需要动画资源,排除在Java中定义这些事情的可能性
  • 我很茫然以对比例的对象动画师如何配合之类的东西android:layout_weightLinearLayout为按百分比分配空间
  • 我很茫然,以C片段是如何在开始处理(GONEandroid:layout_weight0?预动画为0?别的一个规模?)

@Roman Nurik指出,您可以动画任何属性,包括您自己定义的属性.这可以帮助解决硬连线位置的问题,代价是发明自己的自定义布局管理器子类.这有些帮助,但我仍然对Reto的其余解决方案感到困惑.


这个pastebin条目的作者显示了一些诱人的伪代码,基本上说所有三个片段最初都会驻留在容器中,片段C通过hide()事务操作在开始时隐藏.当UI事件发生时,我们接着是show()C和hide()A. 但是,我没有看到它如何处理B改变大小的事实.它还依赖于你显然可以在同一个容器中添加多个片段的事实,我不确定这是否是长期可靠的行为(更不用说它应该打破findFragmentById(),尽管我可以忍受它).


此博客文章的作者表示Gmail根本不使用setCustomAnimations(),而是直接使用对象动画师("您只需更改根视图的左边距+更改右视图的宽度").然而,这仍然是一个双片段解决方案AFAICT,并且再次显示的实现硬连线尺寸以像素为单位.


我将继续关注此问题,所以有一天我可能会自己回答这个问题,但我真的希望有人为这个动画场景制定了三片段解决方案,并且可以发布代码(或链接).Android中的动画让我想要脱掉头发,而那些见过我的人知道这是一个毫无结果的努力.

android android-animation android-fragments

124
推荐指数
5
解决办法
3万
查看次数

平板电脑的Android片段导航 - 单个或多个活动?

我想实现这样的导航(下图),其中片段A,B,C,D表示在应用程序的信息层次结构中向下导航.

在电话上只能看到一个片段,在平板电脑上有两个片段可见.

我见过的所有教程和文档(例如thisthis)都提到了Master-Detail视图,左边有一个主片段,右边有一个详细视图,但似乎没有人指定如何钻从细节更深入.

在此输入图像描述

事实上,平板电脑的GMail应用程序可以作为我自己的应用程序.假设片段A是帐户和文件夹列表,片段B是电子邮件列表,片段C是会话本身.

该屏幕是具有片段A和B的配置 在此输入图像描述

该屏幕具有片段B和C. 在此输入图像描述

问题是:我应该用一个Activity来实现它,其中

  • 对于手机我将有一个FrameLayout片段
  • 对于平板电脑,我将为"左"和"右"片段设置两个FrameLayouts?

如果是这样,我将如何插入新片段?在FragmentTransaction中,我有两个可用的操作 - add()replace().

  • 如果我使用add(),那么下面的片段似乎还活着(它们没有进入暂停状态)并保持完整状态(但可能会浪费一些资源)(因此在片段D中,所有C,B和A仍将存在),在后退按钮上,滚动状态和加载的数据仍然存在
  • 如果我使用replace(),那么之前的片段将被移除,因此在任何时刻顶部将只有一个(在电话上)片段,并且在后退按钮上交易将被反转,旧片段被添加回去,但它赢了不记得以前的状态

这些选项对我来说都不合适.教程在FragmentTransaction中使用replace() - 但是它们如何恢复前一个片段的状态,例如在GMail应用程序中,电话片段B从服务器加载无限滚动,然后当我用片段C替换它时然后回去,B应该出现在它停止的地方,对吧?

我真的不知道该做什么或在哪里看,请指教.

android android-layout android-fragments android-navigation

12
推荐指数
1
解决办法
2052
查看次数

如何只保留第一个添加的片段在后栈(片段重叠)?

我想要实现的场景:

  1. 使用两个框架容器加载活动(有关项目列表和详细信息).
  2. 在应用启动时,在listFrame中添加listFragment,在detailsFrame容器中添加一些初始infoFragment.
  3. 浏览列表项而不将每个详细信息事务添加到后台堆栈(只想在堆栈中保留infoFragment).
  4. 一旦用户点击后退按钮(向后导航),他就会回退到初始信息片段,在发布时间添加内容.
  5. 如果顺序返回导航,则应用程序退出.

我的代码:

        protected override void OnCreate(Bundle savedInstanceState)
        {
...
            var listFrag = new ListFragment();
            var infoFrag = new InfoFragment();
            var trans = FragmentManager.BeginTransaction();
            trans.Add(Resource.Id.listFrame, listFrag);
            trans.Add(Resource.Id.detailsFrame, infoFrag);
            trans.Commit();
...
        }

        public void OnItemSelected(int id)
        {
            var detailsFrag = DetailFragment.NewInstance(id);
            var trans = FragmentManager.BeginTransaction();
            trans.Replace(Resource.Id.detailsFrame, detailsFrag);
            if (FragmentManager.BackStackEntryCount == 0)
                {
                    trans.AddToBackStack(null);
                }
            trans.Commit();
        }
Run Code Online (Sandbox Code Playgroud)

我的问题:

在按下后退按钮后,infoFrag与之前的detailFrag重叠!为什么?

android

9
推荐指数
3
解决办法
2万
查看次数