[android] 다시로드 할 때 조각 새로 고침

안드로이드 응용 프로그램에서 나는로 DB에서 데이터를로드하고있어 TableView, 안쪽 Fragment. 하지만 다시로드 Fragment하면 이전 데이터가 표시됩니다. Fragment이전 데이터 대신 현재 데이터로에 다시 채울 수 있습니까 ?



답변

DB 업데이트시 조각 내용새로 고치고 싶다고 생각합니다.

그렇다면 조각을 분리하고 다시 연결하십시오.

// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();

Your_Fragment_TAG는 프래그먼트를 만들 때 지정한 이름입니다.

이 코드는 지원 라이브러리 용입니다.

구형 장치를 지원하지 않는 경우 getSupportFragmentManager 대신 getFragmentManager 를 사용 하십시오.

[편집하다]

이 방법을 사용하려면 Fragment에 태그가 있어야합니다.
가지고 있지 않은 경우 @Hammer의 방법이 필요합니다.


답변

현재 조각을 새로 고칩니다.

FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
   ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();


답변

조각 태그가없는 경우 다음 코드가 잘 작동합니다.

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
 FragmentTransaction fragTransaction =   (getActivity()).getFragmentManager().beginTransaction();
 fragTransaction.detach(currentFragment);
 fragTransaction.attach(currentFragment);
 fragTransaction.commit();}
}


답변

사용자에게 표시 될 때 조각을 새로 고칠 수 있습니다.이 코드를 조각에 추가하면 조각이 표시 될 때 새로 고쳐집니다.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // Refresh your fragment here          
  getFragmentManager().beginTransaction().detach(this).attach(this).commit();
        Log.i("IsRefresh", "Yes");
    }
}


답변

조각을 새로 고치려면 Nougat 이상 버전에서 응답이 작동하지 않습니다. 모든 OS에서 작동하도록하려면 다음을 수행 할 수 있습니다.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        fragmentManager.beginTransaction().detach(this).commitNow();
        fragmentManager.beginTransaction().attach(this).commitNow();
    } else {
        fragmentManager.beginTransaction().detach(this).attach(this).commit();
    }


답변

조각이 활동에 연결되어있는 동안에는 조각을 다시로드 할 수 없습니다. 여기서 ” Fragment Already Added“예외가 발생합니다.

따라서 조각은 먼저 활동에서 분리 된 다음 연결되어야합니다. 한 줄에 유창한 API를 사용하여 모든 작업을 수행 할 수 있습니다.

getFragmentManager().beginTransaction().detach(this).attach(this).commit();

업데이트 :
API 26 이상에 대한 변경 사항을 통합합니다.

FragmentTransaction transaction = mActivity.getFragmentManager()
                        .beginTransaction();
                if (Build.VERSION.SDK_INT >= 26) {
                    transaction.setReorderingAllowed(false);
                }
                transaction.detach(this).attach
                        (this).commit();

업데이트에 대한 자세한 설명은 https://stackoverflow.com/a/51327440/4514796을 참조 하십시오.


답변

   MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
        getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();

이것은 FragmentManager조각을 초기화하는 데 사용 하는 경우에만 작동합니다 . u는 그것을이있는 경우 <fragment ... />XML에, 그것은 전화를하지 않습니다 onCreateView다시. 이것을 알아내는 데 30 분을 낭비했습니다.