替换的片段不会被破坏

时间:2017-10-12 16:56:09

标签: android android-fragments replace fragmenttransaction fragmentmanager

编辑:
经过一些修修补补后,我发现了我之前遇到问题的原因(见下文.TL; DR:我试图通过替换片段将Bundle从活动传递到其片段)是当替换这样的片段时:

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

被替换的片段不会被破坏(因为它应该根据a bunch of sources),我通过验证覆盖并添加日志记录到onPauseonStoponDestroyViewonDestroy等。这些都不会被调用。
调用popBackStackImmediate也不会做任何事情。 我该怎么办?




上一个问题标题: "使用setImageDrawable动态设置FloatingActionButton图标不会产生任何影响。"
我在片段(称为AddEditFragment)中有一个FAB,用于保存用户对数据库的输入。
为了区分数据库中的编辑行和创建新行,我将其图标设置为"发送"图标或"保存"图标。 默认情况下,该按钮设置为"发送":

    <android.support.design.widget.FloatingActionButton
    android:id="@+id/add_edit_fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    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"/>

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

    @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工作正常并更改了&#34;发送&#34;到&#34;保存&#34;正常。


这是我遇到麻烦的时候。
我想删除我的AddEditFragment类&#39;依赖于我的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方法内)。
它似乎没有任何效果。我的案例是:

  1. 只需添加setImageDrawable电话即可 - 将图标设置为&#34;保存&#34;在添加/编辑模式中,但是我没有&#34;发送&#34;图标。
  2. 动态设置任一个案例(setImageDrawable调用在if块内) - 图标设置为&#34;发送&#34;在添加/编辑模式中。
  3. 删除默认&#34;发送&#34;来自XML的图标,然后动态设置任何一个案例 - 图标设置为&#34;发送&#34;在添加/编辑模式中。
  4. 从XML中删除默认图标,然后仅设置为&#34;保存&#34;动态(无if块) - 将图标设置为&#34;保存&#34;在添加/编辑模式中,但是我没有&#34;发送&#34;图标。
  5. 似乎setImageDrawable调用在我的receiveData界面方法中完美运行,没有任何效果(至少在设置了图标时) ,或在if区内时)。

    我感到茫然,不胜感激任何帮助!


    回复@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 个答案:

答案 0 :(得分:0)

您可能希望使用以下方法清除堆栈

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