Fragment replace Problem

  • Antworten:3
  • Bentwortet
Gelöschter Account
  • Forum-Beiträge: 2.492

04.02.2015, 15:05:25 via Website

Hallo,

ich hoffe ich habe für erfahrene Fragment - Nutzer ein ziemlich einfaches Problem.
Und zwar habe ich mir von AndroidStudio eine NavigationDrawer Acitivty erstellen lassen, bei der standardmäßig ja schon Fragments vorhanden sind. Jetzt wollte ich in der onNavigationDrawerItemSelected aber meine eigenen Fragments nutzen.
Das stand vorher in der oben genannten Methode:

@Override
    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.container, PlaceholderFragment.newInstance(position + 1)).commit();
    }

Und das ist das PlaceholderFragment, aber in der gleichen Klasse wie die Methode oben

public static class PlaceholderFragment extends Fragment {
        private static final String ARG_SECTION_NUMBER = "section_number";

        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            ((MainActivity) activity).onSectionAttached(getArguments().getInt(ARG_SECTION_NUMBER));
        }
    }

Jetzt wollte ich meine Fragments aber auslagern in eigene Klassen. Deswegen habe ich den Code oben einfach in eine andere Klasse geschrieben, wenn ich dann aber in die onNavigationDrawerItemSelected schaue kommt folgender Fehler:

Error: (50, 100) error: incompatible types: PlaceholderFragment cannot be converted to Fragment
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output

Und wenn ich mit der Maus über die Zeile gehe kommt auch, dass replace(int, fragment) nicht zu replace(int, pladeholderfragment) applied werden kann.

Hat da jemand eine Idee?

— geändert am 04.02.2015, 15:06:21

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2015, 15:18:08 via Website

Hallo Lars,

  1. public static class PlaceholderFragment extends Fragment {
    Bitte aus Fragments keine Static Klassen machen! Brauchst du nicht und macht nur Probleme

  2. fragmentManager.beginTransaction().replace(R.id.container, PlaceholderFragment.newInstance(position + 1)).commit();
    Das würde ich zur Übersichtlichkeit in 2 Zeilen aufteilen:

    Fragment f = new PlaceholderFragment.newInstance(position + 1);
    fragmentManager.beginTransaction().replace(R.id.container, f).commit();

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

04.02.2015, 15:32:35 via Website

Hallo,

ja meine Aussage war ein bisschen falsch in der von mir erstellten neuen Klasse habe ich das static nicht mit übernommen.

Wenn ich das unterteile und das PlaceholderFragment aus der gleichen Klasse nehme funktioniert es, wenn ich dann versuche mein Fragment aus der neuen Klasse (habe es MainFragment genannt) zu nehmen sagt er incompatible types bei

Fragment f = new MainFragment().newInstance(position + 1);

Weil MainFragment kein Fragment sondern ein MainFragment ist. Aber das verstehe ich nicht. PlaceholderFragment ist doch auch ein PlaceholderFragment und kein Fragment und beide extenden von Fragment, warum klappt es dann beim einen beim anderen aber nicht.

Oder ist die Variante Fragments in Klassen auszulagern unüblich, dann mach ich es gerne anders. Ist nämlich mein erster Versuch mit Fragments.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

04.02.2015, 15:41:40 via Website

Ich hab den Fehler gefunden.
In der einen Activity wurde von AndroidStudio die support v4 Library und davon das Fragment importet, in meiner Fragment Activity habe ich aber normal das app.Fragment importet, daher kam der Fehler.
Danke für die Hilfe :)

— geändert am 04.02.2015, 15:45:16

Antworten