被替换的片段不会被破坏

Posted

技术标签:

【中文标题】被替换的片段不会被破坏【英文标题】:Replaced fragment is not destroyed 【发布时间】:2018-03-24 17:08:41 【问题描述】:

编辑: 在进行了一些修改之后,我发现了我之前的问题的原因(见下文。TL;DR:我试图通过替换片段将Bundle 从一个活动传递到它的片段)是当替换片段时这个:

    AddEditActivityFragment fragment = new AddEditActivityFragment();
    Bundle arguments = getIntent().getExtras();
    fragment.setArguments(arguments);
    getSupportFragmentManager().beginTransaction()
        .replace(R.id.add_edit_fragment, fragment)
        .commit();

被替换的片段不会被破坏(因为它应该根据abunchofsources),我通过覆盖并将日志添加到onPause来验证这一点、onStoponDestroyViewonDestroy 等。它们都没有被调用。 调用popBackStackImmediate 也无济于事。 我能做什么?

上一个问题标题: “使用 setImageDrawable 动态设置 FloatingActionButton 图标没有任何效果。” 我在片段(称为 AddEditFragment)中有一个 FAB,用于将用户输入保存到数据库。 为了区分从数据库编辑行和创建新行,我将其图标设置为“发送”图标或“保存”图标。 默认情况下,按钮设置为“发送”:

    <android.support.design.widget.FloatingActionButton
    android:id="@+id/add_edit_fab"
    android:layout_
    android:layout_
    android:layout_margin="@dimen/fab_margin"
    app:layout_anchor="@id/add_edit_toolbar"
    app:layout_anchorGravity="bottom|right|end"
    app:srcCompat="@drawable/ic_send_white_24dp"/>

我曾经通过在我的片段中实现一个接口来将图标设置为“保存”,该接口用于将数据从包含的活动传递到片段,使用以下方法:

    @Override
public void receiveData(Serializable data) 
    Log.d(TAG, "receiveData: called");
    mFoodItem = (FoodItem) data;
    if (mFoodItem != null) 
        mEditMode = true;
        fab.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_save_white_24dp));
        utilDisplayFoodItem();
    

setImageDrawable 调用工作正常,并将图标从“发送”正确更改为“保存”。 这是我遇到麻烦的时候。 我正在尝试删除我的 AddEditFragment 类对我的 AddEditActivity 类的依赖,方法是删除所述接口实现并通过Bundle 传递片段所需的数据:

    @Override
protected void onCreate(Bundle savedInstanceState) 
    Log.d(TAG, "onCreate: starts");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_edit);

    AddEditActivityFragment fragment = new AddEditActivityFragment();
    Bundle arguments = getIntent().getExtras();
    boolean editMode = arguments != null;
    fragment.setArguments(arguments);

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.add_edit_fragment, fragment)
            .commit();

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
    getSupportActionBar().setTitle((editMode) ? "Edit Item:" : "Create Item:");
    getSupportActionBar().setElevation(0);
    Log.d(TAG, "onCreate: ends");

在这种情况下,我从片段中删除了receiveData 方法,并放置了这一行:

fab.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_save_white_24dp));

在我的片段类中的各个可能位置(最有可能在其onCreateView 方法中)。 它似乎没有任何效果。我的案例是:

    只需添加上述setImageDrawable 调用 - 在两种添加/编辑模式下都将图标设置为“保存”,但是我没有“发送”图标。 动态设置任何一种情况(setImageDrawable 调用在 if 块内) - 在两种添加/编辑模式中,图标都设置为“发送”。 从 XML 中删除默认的“发送”图标,然后动态设置任一大小写 - 在两种添加/编辑模式中,图标都设置为“发送”。 从 XML 中删除默认图标,然后仅设置为动态“保存”(没有 if 块) - 在两种添加/编辑模式下都将图标设置为“保存”,但是我没有“发送”图标。

似乎setImageDrawable 调用,在我的receiveData 接口方法中完美运行,没有任何效果(至少在已设置图标时,或在@987654347 内部时@ 堵塞)。 我很茫然,不胜感激! 回复@ColdFire:

        @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    Log.d(TAG, "onCreateView: starts");
    View view = inflater.inflate(R.layout.fragment_add_edit, container, false);
    ButterKnife.bind(this, view);

    Bundle arguments = getArguments();
    if (arguments != null) 
        mFoodItem = (FoodItem) arguments.getSerializable(FoodItem.class.getSimpleName());
        if (mFoodItem != null) 
            mEditMode = true;
            // Tried calling setImageDrawable here
        
    

    // Tried calling setImageDrawable here

    if (!mEditMode) 
        // If adding an item, initialize it for right now's date and time
        Calendar now = Calendar.getInstance();
        mFoodItem.setDate(now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH));
        mFoodItem.setTime(now.getTimeInMillis() / Constants.MILLISECONDS);
    
    utilDisplayFoodItem();
    utilSetOnClickListeners();
    setHasOptionsMenu(true);

    // Tried calling setImageDrawable here

    Log.d(TAG, "onCreateView: ends");
    return view;

我应该提一下,依赖于 Bundle 数据的所有其他内容都可以正常工作。

【问题讨论】:

张贴您在片段中处理捆绑数据的代码 现在包含在问题中 【参考方案1】:

您可能想使用以下方法清除回栈

private void clearBackStack() 
    FragmentManager manager = getSupportFragmentManager();
    if(manager.getBackStackEntryCount() > 0) 
        FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
        manager.popBackStackImmediate(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
    

您可能想check this post,谢谢

这只会破坏当前要替换的片段。如果你想摧毁一切你可能想读这个stack question

【讨论】:

遗憾的是,这对我不起作用(您链接的问题也不起作用)。问题不在于片段没有被替换,而是被替换的片段没有被破坏,所以我一直在新片段的顶部看到它的一些视图(特别是 FAB),这意味着它仍然存在。跨度>

以上是关于被替换的片段不会被破坏的主要内容,如果未能解决你的问题,请参考以下文章

分享前端开发常用代码片段

收藏|分享前端开发常用代码片段

关于js----------------分享前端开发常用代码片段

从片段替换片段时,onRequestPermissionsResult 回调不起作用

当片段被替换并且再次可见时回调

access数据库用UltraEdit批量替换了几个IP地址后被破坏,用很多工具无法修复,该怎么办?