Speichern von Fragment Instancen und nutzung der Objekte in Ihnen in anderen Fragmenten

  • 0 Antworten
  • Letztes Antwortdatum
P

PhoenixRising

Neues Mitglied
0
Hallo, ich hatte vor ein paar tagen schon mal so etwas ähnliches vermutet, nun meine Vermutung hat sich dummerweise bewahrheitet, auch wenn es zum damaligen zeitpunkt noch nicht das eigentliche Problem darstellte.

Ich habe mich bei Stackoverflow auch schon Schlau gelesen und keine gescheite lösung für das problem gefunden, hier die erklärung: Ich habe eine MainActivity mit einem TabListner und 4 Fragmenten zwischen dennen geswiped wird. Wenn ich mit aber -1/+1 Fragmente vom letzten Fragment entferne kann ich die Objekte (hauptsächlich EditText und ein paar Checkboxen) nicht mehr über den Klassenamen.Objektnamen.setText("") zurück setzen.

Nun ist die Frage wie ich entweder Instanzen von den Fragmenten zur Laufzeit behalte, oder wie ich zumindest die Values aus den Objekten verändern kann. Ausserdem werden alle eingaben beim MiniMinieren der Applikation auch gelöscht.

Hier meine MainActivity, der FragmentPagerAdapter und das ERSTE und LETZTE Fragment das ich durch Swipe:

MainActivtiy:
Code:
public class MainActivity extends FragmentActivity {
    // Elemente für die Swipes und Fragments
    ViewPager viewpager;
    FragmentPageAdapter ft;
    FragmentManager fm = getSupportFragmentManager();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewpager = (ViewPager) findViewById(R.id.pager);

        ft = new FragmentPageAdapter(fm);

        // Swipe-Elemente
        final ActionBar actionbar = getActionBar();
        viewpager.setAdapter(ft);
        actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ActionBar.TabListener tabListener = new ActionBar.TabListener() {
            @Override
            public void onTabSelected(Tab tab, FragmentTransaction ft) {
                viewpager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(Tab tab, FragmentTransaction ft) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onTabReselected(Tab tab, FragmentTransaction ft) {
                // TODO Auto-generated method stub

            }
        };

        actionbar.addTab(actionbar.newTab().setText("Messe").setTabListener(tabListener));
        actionbar.addTab(actionbar.newTab().setText("Anschrift").setTabListener(tabListener));
        actionbar.addTab(actionbar.newTab().setText("Brands").setTabListener(tabListener));
        actionbar.addTab(actionbar.newTab().setText("Details").setTabListener(tabListener));
        viewpager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                actionbar.setSelectedNavigationItem(arg0);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub

            }
        });

    }
}

FragmentPagerAdapter:

Code:
public class FragmentPageAdapter extends FragmentPagerAdapter {
    MesseSetter messeSetter;
    Anschrift anschrift;
    Brands brands;
    Details details;

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

    @Override
    public Fragment getItem(int arg0) {
        switch (arg0) {
        case 0:
            return new MesseSetter();
        case 1:
            return new Anschrift();
        case 2:
            return new Brands();
        case 3:
            return new Details();
        }
        return null;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 4;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
        switch (position) {
        case 0:
            messeSetter = (MesseSetter) createdFragment;
            break;
        case 1:
            anschrift = (Anschrift) createdFragment;
            break;
        case 2:
            brands = (Brands) createdFragment;
            break;
        case 3:
            details = (Details) createdFragment;
            break;
        }
        return createdFragment;
    }
}

Erstes Fragment, das was beim Appstart angezeigt wird:

Code:
public class MesseSetter extends Fragment {
    // EditTexts
    EditText e_messeName;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View messeLayout = inflater.inflate(R.layout.messesetter, container, false);
        // Elemente - Deklaration
        e_messeName = (EditText) messeLayout.findViewById(R.id.input_messename);
        e_messeName.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                getActivity().getActionBar()
                        .setTitle(getActivity().getTitle() + " - " + e_messeName.getText().toString());
                }
        });

        return messeLayout;
    }

}

Das Letzte Fragment das geswipt wird, hier wird durch den onClickListener versucht fast alle Elemente zuruck zusetzen:
Code:
public class Details extends Fragment {

    EditText e_notizen;
    ImageButton btn_speichern;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View detailsLaylout = inflater.inflate(R.layout.details, container, false);

        btn_speichern = (ImageButton) detailsLaylout .findViewById(R.id.button_speichern);
        btn_speichern.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                MesseSetter.e_messeName.setText("");
                Anschrift.e_aufgenommenVon.setText("");
                Brands.e_adm.setText("");
                e_notizen.setText("");
            }
        });

        return detailsLaylout;
    }
}

}

Es ist einfach nciht die lösung alles auf Static zu setzen, dann kann ich auch nicht die Fragmente die zur Laufzeit in ihrem Lebenszyklus nicht instanzieiert sind referenzeiren. Bitte ich brauche wirklich hilfe :/
 
Zurück
Oben Unten