相关疑难解决方法(0)

add(),replace()和addToBackStack()之间的区别

调用这些方法的主要区别是什么:

fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);
Run Code Online (Sandbox Code Playgroud)

替换已存在的片段,将片段添加到活动状态,并向后台堆栈添加活动是什么意思?

其次,有findFragmentByTag(),这是否搜索由add()/ replace()方法或addToBackStack()方法添加的标记?

android android-fragments

277
推荐指数
7
解决办法
14万
查看次数

动画片段之间的过渡

我试图动画片段之间的过渡.我从以下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)

android android-3.0-honeycomb

273
推荐指数
8
解决办法
28万
查看次数

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万
查看次数

通过动画在活动中交换片段

我想通过动画在一个活动中交换两个片段.假设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)

寻找一些线索.

提前致谢.

android android-animation

86
推荐指数
1
解决办法
9万
查看次数

弹出片段backstack而不播放Pop-Animation

我使用以下代码在片段堆栈上推送片段:

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 android-animation android-fragments

55
推荐指数
4
解决办法
3万
查看次数

片段事务动画完成后执行操作

我想在动画结束后设置按钮可见性.

这就是调用动画的原因:

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)

有没有办法让听众知道我的片段何时消失?

android android-animation android-fragments

53
推荐指数
3
解决办法
4万
查看次数

片段标准转换不是动画

我正在使用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上进行了测试.

这可能有什么问题?

animation android android-fragments android-support-library

45
推荐指数
3
解决办法
4万
查看次数

如何在显示Bottomsheet时调暗背景,而不使用Dialog?

我知道BottomSheetDialog已经这样做了,但我需要使用BottomSheet从中生成的常规和行为BottomSheetBehavior.from().这BottomSheet不会使背景变暗,而且外面的触摸也不会将其关闭.有没有办法在BottomSheet显示时调暗背景?当外面碰到时可能会解雇.基本上行为就像BottomSheetDialog但我必须BottomSheet BottomSheetBehavior直接使用.

谢谢!

android bottom-sheet

38
推荐指数
1
解决办法
1万
查看次数

移除白色屏幕,幻灯片窗口转换在启动时创建

我正在使用黑色背景的活动.同样的活动还有一个工具栏和一个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)

android android-5.0-lollipop

13
推荐指数
1
解决办法
6049
查看次数

如何使用非常深的导航编写Android多窗格应用程序

TL; DR: 具有类似Spotify iPad应用程序的深度导航的多窗格应用程序应该如何在Android上运行,以及如何实现这一点?

长版本: 我正在开发一个应用程序,用户可以看到项目列表,然后可以深入研究这些项目.这些项目详细信息页面可以再次打开相关项目的列表,这些项目又包含详细信息页面等.作为一个手机应用程序,这些将是可能看起来像彼此链接的单独活动: 用户单击Overview中的Item#2并获取详细信息页面,然后单击那里的 这里,物品清单是开放的,用户选择看

在模型中,用户看到初始概览,然后从第一个列表中选择"项目#2".将打开一个新活动,向他显示第2项的详细信息.在这里,他选择查看与项目#2相关的事物列表.第三张图片中新开的活动显示了这个列表,点击一个打开了这个东西的详细信息.他可以根据自己的喜好深入浏览内容.

这通常适用于通常的Android活动.我正在努力将应用程序带到平板电脑,并正在考虑如何最好地实现这一点.计划是创建具有相同概念的多窗格布局.它与iPad Spotify应用程序的工作方式非常相似(一旦创建特定于平板电脑的布局,它们将如何将其带入Android会很有趣).

在平板电脑布局中,每次单击项目或列表名称都会打开相应的子项目,作为从右侧激活的新窗格.与上例中相同的工作流程如下所示:

最初的多窗格平板电脑布局 用户选择项目#2,并在右窗格中打开项目详细信息页面 在详细信息页面上,用户选择 点击Thing#3可在右侧窗格中打开事物详细信息

我不确定如何最好地实现这种导航模式.具有有限导航深度的多窗格应用程序(如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中做动画的方法.

欢迎反馈.我的雇主对我们开发的开放式采购框架总体上是有利的,所以如果这是一个更广泛的兴趣,如果我能提出一个可重用的解决方案,我很乐意分享它.

android android-fragments

11
推荐指数
2
解决办法
7325
查看次数