调用这些方法的主要区别是什么:
fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);
Run Code Online (Sandbox Code Playgroud)
替换已存在的片段,将片段添加到活动状态,并向后台堆栈添加活动是什么意思?
其次,有findFragmentByTag(),这是否搜索由add()/ replace()方法或addToBackStack()方法添加的标记?
我试图动画片段之间的过渡.我从以下Android片段和动画中得到了答案
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
DetailsFragment newFragment = DetailsFragment.newInstance();
ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");
// Start the animated transition.
ft.commit();
Run Code Online (Sandbox Code Playgroud)
还有我的R.anim.slide_in_left
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="50%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
Run Code Online (Sandbox Code Playgroud)
但当我尝试这个时,它表明了
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621)
02-08 16:27:37.961: …Run Code Online (Sandbox Code Playgroud) 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中的动画让我想要脱掉头发,而那些见过我的人知道这是一个毫无结果的努力.
我想通过动画在一个活动中交换两个片段.假设PageA用于屏幕A和左侧屏幕,PageB用于片段B,即屏幕右侧.现在我希望当我点击pageA上的一个按钮时,PageA将移动到屏幕的右侧,带有一些过渡动画.
我尝试了以下代码来替换位置
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
寻找一些线索.
提前致谢.
我使用以下代码在片段堆栈上推送片段:
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_right,
R.anim.slide_in_left, R.anim.slide_out_left);
fragmentTransaction.replace(getId(), newFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
这样,当弹出片段堆栈时,例如通过按下后退按钮,播放片段弹出动画.但是,有些情况下我想在不显示此动画的情况下弹出片段backstack,例如因为我刚刚从另一个活动返回并希望一次显示前一个片段,而没有动画.
示例导航可能如下所示:
有没有办法弹出片段backstack而不播放指定的流行动画?
我想在动画结束后设置按钮可见性.
这就是调用动画的原因:
android.support.v4.app.FragmentTransaction fAnimation = this.getActivity().getSupportFragmentManager().beginTransaction();
fAnimation.setCustomAnimations(android.R.anim.slide_in_left, R.anim.pull_out_to_left);
if (this.isVisible()) {
fAnimation.hide(this);
fAnimation.commit();
}
// code that will be executed when the fragment is gone (after the animation is over)
Run Code Online (Sandbox Code Playgroud)
有没有办法让听众知道我的片段何时消失?
我正在使用v4 android兼容性库来开发平板电脑用户界面,使用专门针对Android 2.2设备的片段.
一切都按照预期的方式工作,除了我无法使任何动画工作,甚至标准动画都没有.
码:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ABCFragment abcFragment = new ABCFragment();
ft.replace(R.id.main_frame_layout_fragment_holder,abcFragment);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
片段冻结大约一秒钟而不是使用过渡动画,而刚刚消失并出现新的片段.
使用:
ft.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
Run Code Online (Sandbox Code Playgroud)
也不起作用.
XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.synergygb.mycustomapp"
android:id="@+id/LinearLayout01" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
android:gravity="bottom">
<FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/main_frame_layout_fragment_holder">
</FrameLayout>
<!-- OTHER FIXED UI ELEMENTS-->
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
我读到自定义动画在兼容性库中被破坏了,但似乎没有人遇到标准转换的问题.我已经在3.2.1摩托罗拉Xoom,2.3 Galaxy Tab 7",2.2仿真器,甚至在2.4.4的HTC G2上进行了测试.
这可能有什么问题?
我知道BottomSheetDialog已经这样做了,但我需要使用BottomSheet从中生成的常规和行为BottomSheetBehavior.from().这BottomSheet不会使背景变暗,而且外面的触摸也不会将其关闭.有没有办法在BottomSheet显示时调暗背景?当外面碰到时可能会解雇.基本上行为就像BottomSheetDialog但我必须BottomSheet BottomSheetBehavior直接使用.
谢谢!
我正在使用黑色背景的活动.同样的活动还有一个工具栏和一个DrawerLayout.此白色屏幕使外观不一致.
打开活动时,如果幻灯片转换速度很慢,则会更加明显.
有什么办法可以删除吗?
在第二个活动上设置输入转换的代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
Slide slide = new Slide();
slide.setSlideEdge(Gravity.RIGHT);
slide.excludeTarget(android.R.id.statusBarBackground, true);
slide.excludeTarget(android.R.id.navigationBarBackground, true);
window.setEnterTransition(slide);
window.setExitTransition(slide);
}
Run Code Online (Sandbox Code Playgroud)
我的风格
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!-- Customize your theme here. -->
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">false</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowSoftInputMode">stateAlwaysHidden|adjustResize</item>
</style>
Run Code Online (Sandbox Code Playgroud) TL; DR: 具有类似Spotify iPad应用程序的深度导航的多窗格应用程序应该如何在Android上运行,以及如何实现这一点?
长版本:
我正在开发一个应用程序,用户可以看到项目列表,然后可以深入研究这些项目.这些项目详细信息页面可以再次打开相关项目的列表,这些项目又包含详细信息页面等.作为一个手机应用程序,这些将是可能看起来像彼此链接的单独活动:

在模型中,用户看到初始概览,然后从第一个列表中选择"项目#2".将打开一个新活动,向他显示第2项的详细信息.在这里,他选择查看与项目#2相关的事物列表.第三张图片中新开的活动显示了这个列表,点击一个打开了这个东西的详细信息.他可以根据自己的喜好深入浏览内容.
这通常适用于通常的Android活动.我正在努力将应用程序带到平板电脑,并正在考虑如何最好地实现这一点.计划是创建具有相同概念的多窗格布局.它与iPad Spotify应用程序的工作方式非常相似(一旦创建特定于平板电脑的布局,它们将如何将其带入Android会很有趣).
在平板电脑布局中,每次单击项目或列表名称都会打开相应的子项目,作为从右侧激活的新窗格.与上例中相同的工作流程如下所示:

我不确定如何最好地实现这种导航模式.具有有限导航深度的多窗格应用程序(如GMail)可以使用包含所有片段的静态ViewGroup(LinearLayout可以)构建,并且深入导航会将下一个容器的内容替换为右侧,并为此设置动画(请参阅CommonWares在SO)上的实现.
这表明自定义ViewGroup将是最佳选择.如果必须显示一个子页面(即"事物列表"),那么它会在ViewGroup中创建一个新子项,该子项的宽度是屏幕的一半,然后滚动可见区域,以便与之交互的窗格并且新的孩子是可见的.要将此正确链接到FragmentTransaction,以便后端堆栈正常工作,我猜它会是这样的:
View newPane = container.addChild();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(newPane, new ListOfThingsFragment(2));
ft.remove(paneOnRight, fragmentOnRight);
ft.commit();
container.animateToRight();
Run Code Online (Sandbox Code Playgroud)
我没有看到在FragmentTransaction中做动画的方法.
欢迎反馈.我的雇主对我们开发的开放式采购框架总体上是有利的,所以如果这是一个更广泛的兴趣,如果我能提出一个可重用的解决方案,我很乐意分享它.