안드로이드 응용 프로그램에서 나는로 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 분을 낭비했습니다.
