0

EDIT :
좀 더 문제가 발생하면 이전 문제의 원인을 발견했습니다. (TL : DR : 활동에서 Bundle을 전달하려고합니다.) 단편 장착하다 이런 단편을 교체 할 때 :대체 된 조각이 손상되지 않았습니다.

AddEditActivityFragment fragment = new AddEditActivityFragment(); 
    Bundle arguments = getIntent().getExtras(); 
    fragment.setArguments(arguments); 
    getSupportFragmentManager().beginTransaction() 
     .replace(R.id.add_edit_fragment, fragment) 
     .commit(); 

I는 무시하고 기록을 추가 확인은 abunchofsources 따른되어야로 )는 (파괴되지 않는 대신 조각 , 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 잘 근무에서 아이콘을 변경 통화가 "보내기"제대로 "저장"합니다.


다음은 문제가 생겼을 때입니다.
내 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 블록) - 두 추가/수정 모드에서 아이콘을 "저장"으로 설정하지만 "보내기"아이콘이 없습니다.
  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