【发布时间】: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_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"/>
我曾经通过在我的片段中实现一个接口来将图标设置为“保存”,该接口用于将数据从包含的活动传递到片段,使用以下方法:
@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 数据的所有其他内容都可以正常工作。
【问题讨论】:
-
张贴您在片段中处理捆绑数据的代码
-
现在包含在问题中
标签: android android-fragments replace fragmenttransaction fragmentmanager