0

編輯:
經過一番更多的修改之後,我發現了我之前的問題的原因(請參閱下面的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),我通過重寫和添加記錄到驗證,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工作的罰款,並從改變圖標「發送」到「保存」正常。


這是我遇到麻煩時。
我想刪除我的AddEditActivity類我AddEditFragment類的依賴,通過經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方法內最有可能存在)。
它似乎沒有任何效果。我的情況是:

  1. 只是增加說setImageDrawable呼叫 - 集圖標「拯救」兩添加/編輯模式,但後來我有沒有「發送」圖標。
  2. 動態設置任意一種情況(setImageDrawable呼叫在if區塊內) - 在添加/編輯模式下圖標都設置爲「發送」。
  3. 從XML中刪除默認「發送」圖標,然後動態設置任意一種情況 - 圖標在添加/編輯模式下都設置爲「發送」。
  4. 從XML中刪除默認圖標,然後設置爲僅動態「保存」(沒有if塊) - 在添加/編輯模式下將圖標設置爲「保存」,但是沒有「發送」圖標。

看來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; 
} 

我應該提到其他一切都依賴於包數據正常工作。

+0

發佈你在其中處理分段數據的代碼 –

+0

現在包含在問題 – NivG

回答

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

+0

可悲的是,這不適用於我(也不是你鏈接的問題) 。 問題不在於片段沒有被替換,而是被替換的片段沒有被銷燬,所以我在新片段的頂部不斷看到它的一些視圖(特別是FAB),這意味着它仍然存在。 – NivG