webentwicklung-frage-antwort-db.com.de

Aktualisieren/erneut laden/instanziieren Sie ein Fragment in einem Android-Registersystem

Ich habe eine Aktivität mit einem Viewpager, der 3 Registerkarten und 3 Fragmente hat. Innerhalb jeder Registerkarte befindet sich ein Fragment. Ich weiß, dass der Fragmentmanager die anfänglichen Instanzen der Fragmente speichert, so dass, wenn ich von einem Tab weg wische, dann zu diesem Tab zurückkehren, er in den Speicher geladen wird und keine Aktualisierungen darauf angewendet werden. 

Ich muss das Gegenteil passieren, das heißt: Jedes Mal, wenn ich auf eine Registerkarte wische, muss eine neue Instanz des Fragments in dieser Registerkarte geladen werden, damit die Daten aktualisiert werden.

Ich habe versucht:

  1. attach-Fragment in onTabSelected trennen (nichts passiert) 
  2. remove add fragment in onTabSelected entfernen (nichts passiert) 
  3. setOffscreenPageLimit (0) (Nichts passiert) 
  4. refresh-Funktion in jedem aufTabSelected aufzurufenden Fragment (gibt nullPointerException)

Ich habe mit diesem Problem eine Woche lang ohne Fortschritte gekämpft. Ich freue mich über jede Hilfe, sei es ein Hinweis, ein Kommentar, ein Vorschlag.

Lass mich wissen, welchen Code ich posten soll, Danke.

12
Pacemaker

Ich würde etwas ähnliches wie das Folgende verwenden:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    private ViewPager ViewPager;
    private TabsPagerAdapter SectionsPagerAdapter;
    private ActionBar actionBar;

    private String[] tabs = { "Event Details", "Line-up", "Donations", };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

     // Initialisation
        ViewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getActionBar();
        SectionsPagerAdapter = new TabsPagerAdapter(getSupportFragmentManager());

        ViewPager.setAdapter(SectionsPagerAdapter);
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Adding Tabs
        for (String tab_name : tabs) {
            actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
        }

        ViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                // on changing the page
                // make respected tab selected
                actionBar.setSelectedNavigationItem(position);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });
    }

    @Override
    public void onTabReselected(Tab tab, Android.app.FragmentTransaction ft) {

    }

    @Override
    public void onTabSelected(Tab tab, Android.app.FragmentTransaction ft) {
        ViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, Android.app.FragmentTransaction ft) {

    }

//Attaching the fragments to the tabPagerAdapter
public class TabsPagerAdapter extends FragmentPagerAdapter {

        public TabsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int index) {

            switch (index) {
            case 0:
                return new EventFragment();
            case 1:
                // Points to the Lineup class
                return new LineupFragment();
            case 2:
                // Points to the 
                return new DonationFragment();
            case 3:

                return new ConcertFragment();
            }

            return null;
        }
@Override
        public int getCount() {
            // get item count - equal to number of tabs
            return 4;
        }
    }

//Add your fragments here

Hoffe das hilft dir :)

4

Ich weiß, die Antwort ist alt, aber ... Ich habe eine Lösung gefunden. Ich kann nicht sagen, ob es das Beste ist, aber in meinem Fall gelöst.

In Aktivität:

@Override
public void onTabSelected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
    // When the given tab is selected, switch to the corresponding page in
    // the ViewPager.
    mViewPager.setCurrentItem(tab.getPosition());


        if (tab.getPosition() == 0) {

            LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
            Intent i = new Intent("TAG_REFRESH");
            lbm.sendBroadcast(i);

        }

}

Und dein Fragment:

public class MyFragment extends Fragment {

MyReceiver r;
public void refresh() {
    //yout code in refresh.
    Log.i("Refresh", "YES");
}

public void onPause() {
    super.onPause();
    LocalBroadcastManager.getInstance(context).unregisterReceiver(r);
}

public void onResume() {
    super.onResume();
    r = new MyReceiver();
    LocalBroadcastManager.getInstance(context).registerReceiver(r,
            new IntentFilter("TAG_REFRESH"));
}

private class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        MyFragment.this.refresh();
    }
}
22
Edwin Wachs

Der kompakteste Ansatz betrifft nur eine einzelne Methode in Ihrer Fragment-Klasse:

public class MyFragment extends Fragment {

  @Override
  public void setUserVisibleHint(boolean isVisibleToUser) {

    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser) {

      // Refresh tab data:

      if(getFragmentManager() != null) {

        getFragmentManager()
        .beginTransaction()
        .detach(this)
        .attach(this)
        .commit();
    }
  }
}
0
Zon