다시로드 할 때 조각 새로 고침
안드로이드 응용 프로그램에서 나는로 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
'Programming' 카테고리의 다른 글
git-gui에서 원하는 언어를 설정하는 방법은 무엇입니까? (0) | 2020.08.26 |
---|---|
Google Maps API v2가 포함 된 ViewPager : 신비한 블랙 뷰 (0) | 2020.08.26 |
드롭 다운을 사용하는 경우 SQL 주입을 방지해야합니까? (0) | 2020.08.25 |
인수가있는 PHP array_filter (0) | 2020.08.25 |
Safari 및 Chrome 데스크톱 브라우저에서 동영상 자동 재생이 작동하지 않습니다. (0) | 2020.08.25 |