【问题标题】:Remove a FAB when a Fragment goes to backstack当 Fragment 进入 backstack 时移除 FAB
【发布时间】:2023-04-01 22:43:01
【问题描述】:

我看过很多答案,但似乎没有找到。我在我的一个片段中使用新的 FAB,并希望在该特定片段进入后台堆栈时将其删除,但我不确定片段中的哪个方法在添加到后台堆栈并被其他片段替换时被调用。

【问题讨论】:

  • 你有什么问题?
  • 我想知道fragment.replace()方法被调用或fragment被添加到back stack时调用的方法

标签: java android fragment back-stack floating-action-button


【解决方案1】:

每当Fragment 被替换或添加到后台堆栈时,都会调用以下方法

1) onPause()

2) onStop()

3) onDestroyView()

在您的Fragment 中以上述任何一种方法调用您的FAB 删除方法。

http://developer.android.com/guide/components/fragments.html#Creating

【讨论】:

  • 我已经尝试了所有这些方法,但没有一个被调用:(
  • @Ravi 所有三个都在我的应用程序中被调用,当我用 backstack 替换片段时,也许你替换错了?
  • 我正在关注谷歌文档,但是当我最小化我的应用程序时,所有这些方法都在调用,但是当我更改片段时它们没有调用!!
  • @Ravi 这些方法在被替换的 fragment 中调用,而不是在宿主活动中调用
【解决方案2】:

这是我的建议-

首先,在你的Activity中添加动画代码和backstack监听器:

public class MainActivity extends AppCompatActivity 
    implements FragmentManager.OnBackStackChangedListener {

    private FloatingActionButton mFab;
    private Animation mShowFab;
    private Animation mHideFab;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getSupportFragmentManager().addOnBackStackChangedListener(this);

        mShowFab = AnimationUtils.makeInAnimation(this, false);
        mShowFab.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationEnd(Animation animation) {
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }

            @Override
            public void onAnimationStart(Animation animation) {
                mFab.setVisibility(View.VISIBLE);
            }
        });

        mHideFab = AnimationUtils.makeOutAnimation(this, true);
        mHideFab.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationEnd(Animation animation) {
                mFab.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }

            @Override
            public void onAnimationStart(Animation animation) {
            }
        });
    }

    public void showFab(boolean show) {
        boolean visible = mFab.isShown();
        if (show) {
            if (!visible)
                mFab.startAnimation(mShowFab);
        } else {
            if (visible)
               mFab.startAnimation(mHideFab);
       }
   }

然后 - 根据 backstack 深度 - 显示或隐藏 FAB:

    @Override
    public void onBackStackChanged() {
        showFab(getSupportFragmentManager().getBackStackEntryCount() > 0);
    }

【讨论】:

  • 什么时候调用 onBackStackChnaged()?
  • 当你将片段推入/弹出回栈时
  • onBackStackChanged() 没有被调用?
  • 您是否将 Fragment 推回堆栈?你给getSupportFragmentManager().addOnBackStackChangedListener(this);打过电话吗?
  • 我不想在后台堆栈中添加那个特定的片段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 2012-05-03
  • 2011-07-13
相关资源
最近更新 更多