被替换的片段不会被破坏
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
来验证这一点、onStop
、onDestroyView
、onDestroy
等。它们都没有被调用。
调用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----------------分享前端开发常用代码片段