标签: fragmenttransaction

当必须保存父活动的状态时,如何处理片段事务?

我的应用程序有几个片段和活动.在主要父活动的生命周期的过程中,应用程序在其他活动中向用户呈现信息/选项.

Fragments的文档对commit()有以下规定:

警告:只有在活动保存其状态(用户离开活动时)之前,才能使用commit()提交事务.如果在该点之后尝试提交,则将引发异常.这是因为如果需要恢复活动,则提交后的状态可能会丢失.对于可以丢失提交的情况,请使用commitAllowingStateLoss().

问题是,在返回父活动之后,我再也不能使用FragmentTransactions,它是我在应用程序中设计导航的方式不可或缺的.

我想到的一个解决方案是将我的活动更改为片段,但我的应用程序最终也会使用应用内结算,我相信它总会开始自己的活动.这似乎是一个巨大的限制 - 在开发的某个阶段,我最终将不得不显示一个单独的活动.

我可能会使用commitAllowingStateLoss(),但我觉得我错过了Android平板电脑应用程序开发中的一个主要概念.有没有办法启动活动然后返回父活动(管理片段)而不会失去提交FragmentTransactions的能力?

android android-fragments android-3.0-honeycomb fragmenttransaction

8
推荐指数
1
解决办法
3414
查看次数

将Android片段移动到不同的容器无法更改片段的容器ID

以下是我希望我的应用程序在平板电脑上执行的操作.Fragment(0)有一些菜单会显示片段(1)...(n),如下所示:

-----------------
|   |   |   |   |
|   |   |   |   |
|(0)| X | X | X |
|   |   |   |   |
|   |   |   |   |
-----------------
 becomes
-----------------
|   |   |   |   |
|   |   |   |   |
|(0)|(1)| X | X |
|   |   |   |   |
|   |   |   |   |
-----------------
 and then
-----------------
|   |   |   |   |
|   |   |   |   |
|(0)|(2)|(1)| X |
|   |   |   |   |
| …
Run Code Online (Sandbox Code Playgroud)

android viewgroup android-fragments fragmenttransaction

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

Android - 在同一XML文件上制作翻译和objectAnimator

我一直试图在从一个片段滑动到另一个片段的同时制作3D立方体旋转效果.首先我使用的是翻译效果(在XML上)调用,FragmentTransaction.setCustomAnimations(...)然后,当打开/关闭片段时,我正在使用Camera classe进行旋转.

这工作很精细,但似乎我有太多(不要问我为什么)只使用XML文件使用所有这个动画.经过长时间的搜索,我发现我应该使用objectAnimator进行旋转.

跟着谷歌样本,我设法制作翻转动画.现在我需要翻译片段,让它们滑入并滑出.似乎我不能使用objectAnimator并在同一XML文件上转换效果.由于出现此错误:

java.lang.RuntimeException: Unknown animator name: translate at (...)
Run Code Online (Sandbox Code Playgroud)

关于如何制作滑动效果并同时使用objectAnimator的任何想法?

感谢您的时间!

代码我一直在使用:

card_flip_right_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- Before rotating, immediately set the alpha to 0. -->
    <objectAnimator
        android:duration="0"
        android:propertyName="alpha"
        android:valueFrom="1.0"
        android:valueTo="0.0" />

    <!-- Rotate. -->
    <objectAnimator
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:propertyName="rotationY"
        android:valueFrom="180"
        android:valueTo="0" />

    <!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
    <objectAnimator
        android:duration="1"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:valueFrom="0.0"
        android:valueTo="1.0" />

</set>
Run Code Online (Sandbox Code Playgroud)

片段调用另一个片段:(在此2之间应该可以看到立方体旋转)

private void launchArticle(int prev, int pos){
        ArticleFragment newFragment = new ArticleFragment();
        Bundle …
Run Code Online (Sandbox Code Playgroud)

android fragmenttransaction

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

setCustomAnimation回调之前和之后的FragmentTransaction

我正在使用自定义动画来替换片段,我想在动画开始时禁用一些按钮,然后在动画结束时启用.我怎样才能做到这一点?

android android-fragments fragmenttransaction

8
推荐指数
1
解决办法
7454
查看次数

FragmentTransaction.remove(Fragment)之后FragmentManager.getFragmens().size()不会减少

经过一段时间搜索我的NPE的原因后,我注意到尽管FragmentTransaction.remove(Fragment)确实删除了Fragment,但FragmentManager.getFragments()返回的List的大小仍然相同.此屏幕截图显示了删除片段后此方法返回的内容:

https://www.dropbox.com/s/s3bt1p7i71a5kgx/erro%20fm.PNG

该列表有3个片段,为什么大小仍为4?

android android-fragments fragmenttransaction fragmentmanager

8
推荐指数
0
解决办法
735
查看次数

带有动画的Android Fragment Transaction会导致白色闪烁

我有两个片段.片段A最初在视图中.当用户按下按钮时,使用以下方法将片段B动画化为视图.当我弹出片段B时,它会在视图中向下移动,但在完成后屏幕会闪烁白色.不确定是什么导致这种情况,似乎只发生在kit-kat而不是棒棒糖上.正在使用的动画是向上滑动并向下滑动在xml中定义的动画.

@Override
public void loadFragment(BaseFragment fragment, boolean replace, boolean addToBackStack, int animIn, int animOut, int animPopIn, int animPopout) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    if (animIn != -1 && animOut != -1 && animPopIn != -1 && animPopout != -1) {
        transaction = transaction.setCustomAnimations(animIn, animOut, animPopIn, animOut);
    } else if (animIn != -1 && animOut != -1) {
        transaction = transaction.setCustomAnimations(animIn, animOut);
    }

    if (replace) {
        transaction = transaction.replace(R.id.container, fragment);
    } else {
        transaction = transaction.add(R.id.container, fragment);
    }

    if (addToBackStack) { …
Run Code Online (Sandbox Code Playgroud)

android android-animation android-fragments fragmenttransaction

8
推荐指数
1
解决办法
924
查看次数

来自ApiDemos样本的FragmentLayout类中的Strange FragmentTransaction

对不起,这个问题适用于那些使用Eclipse访问ApiDemo示例代码的人.
具体来说,我试图将片段活动基于名为FragmentLayout的样本

以下代码对我来说有问题(您可以在ApiDemo FragmentLayout.java,ShowDetails()方法中找到完整代码):

                // Execute a transaction, replacing any existing fragment
                // with this one inside the frame.
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                if (index == 0) {
                    ft.replace(R.id.details, details);
                } else {
                    ft.replace(R.id.a_item, details);
                }
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. index == 0和之间有什么区别index != 0

  2. 资源R.id_a_item(在搜索之后仅在所有ApiDemos中出现)属于某种菜单快捷方式资源,根本不清楚为什么在这里使用它.

android.developers指南没有解释这段代码.

android sample android-fragments fragmenttransaction

7
推荐指数
1
解决办法
963
查看次数

AppCompat Action Bar库未显示添加的片段

编辑:如果我延伸FragmentActivity而不是ActionBarActivity我的布局再次显示(ActionBar当然没有).

设备ActionBar上的工作原理4.x,但在我的2.3设备上,我得到的是它下面ActionBar空白屏幕.在Fragment似乎没有被获取添加到Activity.

的themes.xml

<style name="AppTheme" parent="AppBaseTheme">
    <item name="actionBarStyle">@style/Widget.ActionBar</item>
</style>
Run Code Online (Sandbox Code Playgroud)

主题-v11.xml

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:actionBarStyle">@style/Widget.ActionBar</item>
</style>
Run Code Online (Sandbox Code Playgroud)

styles.xml

<style name="Widget.ActionBar" parent="@style/Widget.AppCompat.ActionBar">
    <item name="android:background">@color/actionbar_background</item>
    <item name="background">@color/actionbar_background</item>
</style>
Run Code Online (Sandbox Code Playgroud)

活动 onCreate()

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
myFragment = new WallFragment();
fragmentTransaction.add(android.R.id.content, 
    myFragment, myFragment.FRAGMENT_TAG);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

我正在使用Gradle将AppCompat ActionBar库包含在我的应用程序中.

compile 'com.android.support:appcompat-v7:18.0.+'
Run Code Online (Sandbox Code Playgroud)

android android-fragments fragmenttransaction android-actionbar-compat

7
推荐指数
1
解决办法
3602
查看次数

如何在Android上实现平滑的片段交易动画

我主要使用iOS,已经习惯了非常流畅和流畅的屏幕更改动画.我现在正在开发一个Android应用程序,并且不能在我的生活中获得一个片段事务来顺利添加/替换片段.

我的设置如下:MainActivity有一个FrameLayoutxml,我立即加载FragmentA到它MainActivityOnCreate.我的应用程序,然后进行更换MainActivityFrameLayoutFragmentB,FragmentC,等.所以我的整个应用程序有1个活动.

在按钮单击时,我调用以下内容来添加/替换当前片段:

        getFragmentManager()
            .beginTransaction()
            .setCustomAnimations(R.animator.slide_in, android.R.animator.fade_out, android.R.animator.fade_in, R.animator.slide_out)
            .addToBackStack(null)
            .add(R.id.fragment_1, fragment)
            .commit();
Run Code Online (Sandbox Code Playgroud)

slide_in.xml看起来像(slide_out.xml显然是相反的):

 <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
            android:interpolator="@android:interpolator/linear"
            android:propertyName="xFraction"
            android:valueType="floatType"
            android:valueFrom="1.0"
            android:valueTo="0"
            android:duration="@android:integer/config_shortAnimTime"
        />
</set>
Run Code Online (Sandbox Code Playgroud)

滑入和滑出我动画xFraction,我已经子类化LinearLayout了这样做:

public class SlidingLinearLayout extends LinearLayout {

    private float yFraction = 0;
    private float xFraction = 0;

    public SlidingLinearLayout(Context context) {
        super(context);
    }

    public SlidingLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    } …
Run Code Online (Sandbox Code Playgroud)

performance android android-fragments fragmenttransaction

7
推荐指数
1
解决办法
3603
查看次数

什么时候应该在 FragmentTransaction 上调用 setReorderingAllowed()?

在Google I/O 2017 演讲的这一部分中,演讲者介绍了一个新的 API,setReorderingAllowed()可以在FragmentTransaction.

演讲者解释说:

它允许所有的执行同时发生而不改变你的片段状态,然后在最后我们调出所有需要调出的片段并拆除所有需要拆除的片段……所以我们可以优化这给你。

并显示以下代码示例:

fragmentManager.beginTransaction()
    .replace(R.id.container, fragment1)
    .addToBackStack("state1")
    .setReorderingAllowed(true)
    .commit();

fragmentManager.beginTransaction()
    .replace(R.id.container, fragment2)
    .addToBackStack("state2")
    .setReorderingAllowed(true)
    .commit();
Run Code Online (Sandbox Code Playgroud)

FragmentTransaction单独提交s不会否定任何优化,.setReorderingAllowed(true)因为它们是单独发生的吗?

由于这是一个新发布的 API,因此目前似乎没有可用的文档。

android android-fragments fragmenttransaction

7
推荐指数
1
解决办法
5410
查看次数