你应该如何实现那种例如Honeycomb Gmail客户端使用的滑动?
可以TransactionManager通过添加和删除片段自动处理这个,由于模拟器是幻灯片,所以很难测试这个:)
TL; DR:我正在寻找一个完整的工作样本,我将其称为"Gmail三片段动画"场景.具体来说,我们想从两个片段开始,如下所示:

在一些UI事件(例如,点击片段B中的某些内容)时,我们希望:
并且,在按下BACK按钮时,我们希望反转这组操作.
现在,我已经看到了很多部分实现; 我将在下面回顾其中的四个.除了不完整之外,他们都有自己的问题.
@Reto迈尔促成这种普遍的回答相同的基本问题,表明你会使用setCustomAnimations()一个FragmentTransaction.对于双片段场景(例如,您最初只看到片段A,并希望使用动画效果将其替换为新的片段B),我完全同意.然而:
<objectAnimator>他的代码示例使用像素的硬连线的位置,这似乎是不切实际给出不同的屏幕尺寸,但setCustomAnimations()需要动画资源,排除在Java中定义这些事情的可能性android:layout_weight在LinearLayout为按百分比分配空间GONE?android:layout_weight的0?预动画为0?别的一个规模?)@Roman Nurik指出,您可以动画任何属性,包括您自己定义的属性.这可以帮助解决硬连线位置的问题,代价是发明自己的自定义布局管理器子类.这有些帮助,但我仍然对Reto的其余解决方案感到困惑.
这个pastebin条目的作者显示了一些诱人的伪代码,基本上说所有三个片段最初都会驻留在容器中,片段C通过hide()事务操作在开始时隐藏.当UI事件发生时,我们接着是show()C和hide()A. 但是,我没有看到它如何处理B改变大小的事实.它还依赖于你显然可以在同一个容器中添加多个片段的事实,我不确定这是否是长期可靠的行为(更不用说它应该打破findFragmentById(),尽管我可以忍受它).
此博客文章的作者表示Gmail根本不使用setCustomAnimations(),而是直接使用对象动画师("您只需更改根视图的左边距+更改右视图的宽度").然而,这仍然是一个双片段解决方案AFAICT,并且再次显示的实现硬连线尺寸以像素为单位.
我将继续关注此问题,所以有一天我可能会自己回答这个问题,但我真的希望有人为这个动画场景制定了三片段解决方案,并且可以发布代码(或链接).Android中的动画让我想要脱掉头发,而那些见过我的人知道这是一个毫无结果的努力.
我想实现这样的导航(下图),其中片段A,B,C,D表示在应用程序的信息层次结构中向下导航.
在电话上只能看到一个片段,在平板电脑上有两个片段可见.
我见过的所有教程和文档(例如this和this)都提到了Master-Detail视图,左边有一个主片段,右边有一个详细视图,但似乎没有人指定如何钻从细节更深入.

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

问题是:我应该用一个Activity来实现它,其中
如果是这样,我将如何插入新片段?在FragmentTransaction中,我有两个可用的操作 - add()和replace().
add(),那么下面的片段似乎还活着(它们没有进入暂停状态)并保持完整状态(但可能会浪费一些资源)(因此在片段D中,所有C,B和A仍将存在),在后退按钮上,滚动状态和加载的数据仍然存在replace(),那么之前的片段将被移除,因此在任何时刻顶部将只有一个(在电话上)片段,并且在后退按钮上交易将被反转,旧片段被添加回去,但它赢了不记得以前的状态这些选项对我来说都不合适.教程在FragmentTransaction中使用replace() - 但是它们如何恢复前一个片段的状态,例如在GMail应用程序中,电话片段B从服务器加载无限滚动,然后当我用片段C替换它时然后回去,B应该出现在它停止的地方,对吧?
我真的不知道该做什么或在哪里看,请指教.
我想要实现的场景:
我的代码:
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 ×4