编辑:
经过一些修修补补后,我发现了我之前遇到问题的原因(见下文.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),我通过验证覆盖并添加日志记录到onPause
,onStop
,onDestroyView
,onDestroy
等。这些都不会被调用。
调用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
方法内)。
它似乎没有任何效果。我的案例是:
setImageDrawable
电话即可 - 将图标设置为&#34;保存&#34;在添加/编辑模式中,但是我没有&#34;发送&#34;图标。setImageDrawable
调用在if
块内) - 图标设置为&#34;发送&#34;在添加/编辑模式中。if
块) - 将图标设置为&#34;保存&#34;在添加/编辑模式中,但是我没有&#34;发送&#34;图标。似乎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数据的其他一切都能正常工作。
答案 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