Fragment hängende Verarbeitung


FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.add(ViewId,fragment);// 或者fragmentTransaction.replace(ViewId,fragment);
fragmentTransaction.commit();


基础更好一点的同学会用show和hide方法
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.hide(new FirstFragment()).show(new SecondFragment())

Fragment erstellt  jedes Mal eine neue Instanz, wenn es hinzugefügt/ersetzt oder angezeigt/ausgeblendet wird , was der fatale Grund ist ! ! ! ! !

Der Hauptgrund für das Sliding Freeze ist, dass bei jedem Umschalten des Viewpagers die eingestellte Seitenzahl zwischengespeichert wird, wodurch der Lebenszyklus im Fragment jedes Mal neu aufgerufen wird, und einige Initialisierungsinhalte, Netzwerkanfragen usw .wird unendlich aufgerufen.

Die Lösung gliedert sich in zwei Schritte:

1. Stellen Sie zunächst die Anzahl der Viewpager-Caches auf die Anzahl der Fragmente, also die Anzahl der Seiten, ein.

Beispiel: viewPager.setOffscreenPageLimit(7); Auf diese Weise können alle Seiten zwischengespeichert werden, wenn der Viewpager und das Fragment zum ersten Mal erstellt werden, und die zwischengespeicherten Fragmentseiten werden nicht zwischengespeichert, wenn die Seite erneut gewechselt wird.

2. Schreiben Sie Lazy Loading für Fragment , das nur aufgerufen wird, wenn sich das aktuelle Fragment im sichtbaren Fenster befindet.

Schreiben Sie die setUserVisibleHint-Methode von Fragment um, die aufgerufen wird, wenn jedes Fragment im Adapter umgeschaltet wird. Wenn es zur aktuellen Seite umgeschaltet wird, dann isVisibleToUser==true, andernfalls ist es falsch.

3. Dynamischer Lademodus:

//首先需要先实例好n个全局Fragment

//private  Fragment  currentFragment=new Fragment();(全局)

 
private  FragmentTransaction switchFragment(Fragment targetFragment) {
        FragmentTransaction transaction =getSupportFragmentManager().beginTransaction();
        //第一次使用switchFragment()时currentFragment null,所以要判断一下
        if (!targetFragment.isAdded()) {
            if (currentFragment != null) {
                transaction.hide(currentFragment);
            }
            transaction.add(R.id.fragment,targetFragment,targetFragment.getClass().getName());
        } else {
            transaction.hide(currentFragment).show(targetFragment);
        }
        currentFragment = targetFragment;
        return transaction;   
    }
在点击切换Fragment时:

 
@Override
public void onTabSelected(@IdRes int tabId) {
 
        if (tabId == R.id.tab_one){
 
            switchFragment(first).commit();
 
        }
        if (tabId == R.id.tab_two){
            switchFragment(second).commit();
        }
        if (tabId == R.id.tab_three){
            switchFragment(third).commit();
        }
}

Es wird nur einmal instanziiert, was soll ich also tun, wenn die Daten in meinem Fragment aktualisiert werden müssen? Meine Antwort ist - die Software wird geschlossen und neu gestartet!

Glücklicherweise wird die offizielle onHiddenChanged-Methode bereitgestellt, die jedes Mal ausgeführt wird, wenn das Verstecken oder Anzeigen umgeschaltet wird, und die Daten können hier aktualisiert werden!

//此方法在Fragment中

@Override public void onHiddenChanged(boolean hidden) {    
super.onHiddenChanged(hidden);    
if (hidden){
    //Fragment隐藏时调用    
}else {     
    //Fragment显示时调用   
}
}

Ist diese Methode eleganter, als jedes Mal einen großen Lebenszyklus auszuführen, wenn Aktualisierungsdaten hinzugefügt oder ersetzt werden!

 

Guess you like

Origin blog.csdn.net/xiaowang_lj/article/details/129041741