0

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(); 

置き換えフラグメントが破壊されません)フラグメントを交換すると、次のように断片を交換するときということです,onStoponDestroyView,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メソッド内部有力です)。
効果がないようです。私の例は次のとおりです。 - の両方に「保存」するセットのアイコン/編集モードを追加したが、その後私は、「送信」アイコンを持っていない

  1. だけ追加setImageDrawableコールが言いました。
  2. いずれの場合も動的に設定します(setImageDrawableコールはifブロック内にあります) - アイコンは両方の追加/編集モードで「送信」に設定されています。
  3. デフォルトの「送信」アイコンをXMLから削除して、どちらの場合も動的に設定します。 - アイコンは両方の追加/編集モードで「送信」に設定されています。
  4. XMLからデフォルトのアイコンを削除して、「保存」のみを動的に実行します(ifブロック) - 両方の追加/編集モードでアイコンを「保存」に設定しますが、「送信」アイコンはありません。
  5. それは私の 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; 
} 

私は、バンドルデータに依存して他のすべてが正常に動作することを言及する必要があります。

+0

フラグメント番号 –

+0

でバンドルデータを処理するコードを投稿してください – NivG

答えて

0

あなたは、あなたが感謝

はこれが唯一の現在の断片を交換する破壊する、check this postする場合があります以下の方法

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); 
    } 
} 

を使用してスタックをバッククリアしたいかもしれません。すべてを破壊したい場合はstack question

+0

これは私にとってはうまくいきません(リンクした質問もありません) 。 問題は、フラグメントが置き換えられないということではなく、置き換えられたフラグメントが破棄されないため、新しいフラグメントの上にそのビュー(FAB)の一部が表示され続けているということです。 – NivG

関連する問題