EDIT:
これまでの問題の原因がわかりました(TL:DR:アクティビティのBundle
を私はオーバーライドしてへのロギングを追加することによって検証され、(それはabunchofsourcesに応じなければなりませんよう)置き換えられたフラグメントは破壊されていません
AddEditActivityFragment fragment = new AddEditActivityFragment();
Bundle arguments = getIntent().getExtras();
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction()
.replace(R.id.add_edit_fragment, fragment)
.commit();
置き換えフラグメントがが破壊されません)フラグメントを交換すると、次のように断片を交換するときということです,onStop
、onDestroyView
,onDestroy
などが挙げられる。
popBackStackImmediate
を呼び出すことも何もしません。 どうすればいいですか?
前の質問のタイトル: "setImageDrawableで動的にFloatingActionButtonアイコンを設定することも効果はありません。"
私は、ユーザー入力をデータベースに保存するためのフラグメント(AddEditFragment)の内部にFAB
を持っています。
DBから行を編集して新しい行を作成する方法を区別するために、アイコンに「送信」アイコンまたは「保存」アイコンを設定しました。 はデフォルトでは、ボタンは「送信」に設定されている:
<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"/>
Iフラグメントを含有する活動からのデータを渡すのに役立つ私のフラグメント、でインターフェイスを実装することで、「保存」アイコンを設定するために使用しました、この方法で使用した:
@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
がうまく働いていたし、適切に「保存」して「送信」からアイコンを変更します。
ここで私は問題に遭遇します。
私が言ったインタフェースの実装を削除し、Bundle
を経由してフラグメントに必要なデータを渡すことによって、私のAddEditActivityクラスに私AddEditFragmentクラスの依存関係を削除しようとしています:
@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
ブロック) - 両方の追加/編集モードでアイコンを「保存」に設定しますが、「送信」アイコンはありません。 それは私の
receiveData
インターフェイスメソッドで完全に働いた
setImageDrawable
コールを、思わ
、は(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;
}
私は、バンドルデータに依存して他のすべてが正常に動作することを言及する必要があります。
フラグメント番号 –
でバンドルデータを処理するコードを投稿してください – NivG