Programming

다시로드 할 때 조각 새로 고침

procodes 2020. 8. 25. 21:33
반응형

다시로드 할 때 조각 새로 고침


안드로이드 응용 프로그램에서 나는로 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();}
}

조각을 새로 고치려면 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();
    }

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

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

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

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


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

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

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

Update: This is to incorporate the changes made to API 26 and above:

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

For more description of the update please see https://stackoverflow.com/a/51327440/4514796


Use a ContentProvider and load you data using a 'CursorLoader'. With this architecture your data will be automatically reloaded on database changes. Use third-party frameworks for your ContentProvider - you don't really want to implement it by yourself...


I had the same issue but none of the above worked for mine. either there was a backstack problem (after loading when user pressed back it would to go the same fragment again) or it didnt call the onCreaetView

finally i did this:

public void transactFragment(Fragment fragment, boolean reload) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    if (reload) {
        getSupportFragmentManager().popBackStack();
    }
    transaction.replace(R.id.main_activity_frame_layout, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

good point is you dont need the tag or id of the fragment either. if you want to reload


Here what i did and it worked for me i use firebase and when user is logIn i wanted to refresh current Fragment first you will need to requer context from activity because fragment dont have a way to get context unless you set it from Activity or context here is the code i used and worked in kotlin language i think you could use the same in java class

   override fun setUserVisibleHint(isVisibleToUser: Boolean) {
    super.setUserVisibleHint(isVisibleToUser)
    val context = requireActivity()
    if (auth.currentUser != null) {
        if (isVisibleToUser){
            context.supportFragmentManager.beginTransaction().detach(this).attach(this).commit()
        }
    }

}

Make use of onResume method... both on the fragment activity and the activity holding the fragment.


Easiest way

make a public static method containing viewpager.setAdapter

make adapter and viewpager static

public static void refreshFragments(){
        viewPager.setAdapter(adapter);
    }

call anywhere, any activity, any fragment.

MainActivity.refreshFragments();

protected void onResume() {
        super.onResume();
        viewPagerAdapter.notifyDataSetChanged();
    }

Do write viewpagerAdapter.notifyDataSetChanged(); in onResume() in MainActivity. Good Luck :)

참고URL : https://stackoverflow.com/questions/20702333/refresh-fragment-at-reload

반응형