Update-Fragment in FragmentPagerAdapter in SherlockFragmentActivity
Ich bin nach dem Beispiel FragmentTabsPager unter den Proben von ActionBarSherlock.
In meinem Fall habe ich einen einfachen SherlockActivity mit der TabsPager und den gleichen code aus dem Beispiel für die FragmentPagerAdapter.
Ich habe zwei Fragmente (verschiedene Klassen). Die erste enthält nur vier Tasten. Je nachdem welche angeklickt wird, wird die Haupttätigkeit bekommt einen code (z.B. 1,2,3,4). Ich richtig den code für die gedrückte Taste.
Nun, in der zweiten Fragment will ich etwas zeichnen, abhängig von diesem code, oder, was dasselbe ist, die sich dynamisch aktualisieren, seiner Ansicht.
Ich habe schon gesucht nach einer Lösung aber ich habe nichts. In diesem Fall habe ich dieses:
[MainActivity.java]
public static class TabsAdapter extends FragmentPagerAdapter
implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final TabHost mTabHost;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
[...]
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}
Ich es geschafft, aktualisieren Sie die Bundle-info.args, mit dem neuen Wert, aber ich weiß nicht, wie es passieren das fragment richtig und um es zu aktualisieren, seine dynamische Sicht.
Ist das möglich?
Vielen Dank im Voraus.
UPDATE
Schließlich habe ich das verwendet, was Sunny freundlicherweise erklärt. Ich hielt eine SparseArray mit meinem Fragmente also ich könnte auf jeden Fall der Zugang zu Ihnen, wie ich weiß, seine position innerhalb MainActivity:
[MainActivity.java]
//Once the user presses the button on the first fragment, the callback calls
//this function
public void onImageSelected(int iNumber){
MySecondFragment msf = (MySecondFragment)mTabsAdapter.getFragment(POS_1);
if(msf != null){
msf.setNumImage(iNumber);
msf.updateView();
}
}
Und schließlich in MySecondFragment.java ich kann auf meinem Layout-Komponenten (z.B. GridView), wie Sie initialisiert wurden während der onCreateView, also ich habe alle Codes die ich brauchte, in meinem updateView () - Methode.
Ich zum Beispiel, aktualisieren Sie den Inhalt eines GridView:
[MySecondFragment.java]
myGridView.setBackground(getResources().getDrawable(iCode));
HTH
UPDATE 2
Ich habe den folgenden code, um zu speichern Sie die Fragmente in den Zustand Bündel der wichtigsten Aktivitäten. Wenn die Anwendung änderungen von hochformat auf Querformat oder Umgekehrt (es ist neu) die Funktion getItem ist nicht genannt, so dass die SparseArray Karte ist nicht wieder aufgefüllt mit den nötigen Fragmente:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(CURRENT_TAB, mTabHost.getCurrentTabTag());
getSupportFragmentManager().putFragment(outState, MyFirstFragment.class.getName(), mTabsAdapter.getFragment(POS_1));
getSupportFragmentManager().putFragment(outState, MySecondFragment.class.getName(),
mTabsAdapter.getFragment(POS_2));
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null) {
MyFirstFragment mff = (MyFirstFragment) getSupportFragmentManager().getFragment(savedInstanceState, MyFirstFragment.class.getName());
if(mff != null)
mTabsAdapter.setFragment(POS_1, mff);
MySecondFragment msf = (MySecondFragment) getSupportFragmentManager().getFragment(
savedInstanceState, MySecondFragment.class.getName());
if(msf != null)
mTabsAdapter.setFragment(POS_2, msf);
mTabHost.setCurrentTabByTag(savedInstanceState
.getString(CURRENT_TAB));
}
}
Auch innerhalb der TabsAdapter Klasse:
public Fragment getFragment(int pos) {
return map.get(pos);
}
public void setFragment (int position, Fragment fragment) {
map.put(position, fragment);
}
HTH
Du musst angemeldet sein, um einen Kommentar abzugeben.
anhanniballake beantworten könnte. Aber Diese brechen könnte in der Zukunft.
Tatsächlich das fragment definieren Sie eine sparesArray in Ihrem TabAdapter Klasse
und fügen Sie Ihre Fragmente in diesem array
Müssen Sie auch entfernen Sie das fragment von der Landkarte, als fragment erhalten, zerstören
Definieren Sie nun eine öffentliche Methode in TabAdapter Klasse, kann man Fragmente
Nun in Ihrem Haupt-SherlockFragementActivity können Sie die Instanz von jedem fragment
Rufen Sie nun eine beliebige Methode in Ihre Fragmente mit fragment-Instanz, die Sie oben habe
doAnyThingInMySecondFragment
muss als public deklariert 🙂MainSherlockActvity's
onCreate
Methode aufgerufen wird, und inonCreate
Methode Ihre tabAdapter bekommen initialisiert wieder. So Ihr sparesArray sollte nicht null sein. und sollten Sie 'FragmentStatePagerAdapter'.Den Quelle für FragmentPagerAdapter zeigt, dass die Fragmente werden mit folgenden tag:
Wo
viewId
ist die R. id IhresViewPager
undid
ist die Seitenzahl.Daher können Sie abrufen, die zweite Seite ist Fragment mithilfe:
Wo
pager
ist IhreViewPager
. Sie würde dann werfen wollte, die zurückgegeben Fragment zu was auch immer bestimmte Klasse, die Sie haben, dann rufen Sie eine Methode übergeben, die Informationen, die Sie benötigen.