Wie ersetze ich ein Fragment beim Klicken auf die Schaltfläche dieses Fragments?

Lesezeit: 4 Minuten

Wie ersetze ich ein Fragment beim Klicken auf die Schaltflache
Top-Katze

Ich habe eine Aktivität mit mehreren Fragmenten. Aktivität hat zunächst ein Fragment und darin zwei Schaltflächen. Wenn ich auf diese Schaltfläche klicke, muss ich das Fragment durch ein neues Fragment ersetzen. Jedes Fragment hat verschiedene Widgets und ersetzt das aktuelle Fragment als verschiedene Ereignisse.

Das ist mein Problem. Wie kann ich das erreichen?

Schlagen Sie mir Ideen vor.

  • Warum kann man nicht einfach die Sichtbarkeit der Fragmente ändern?

    – Gruseliger Wombat

    20. Januar ’14 um 7:56

  • Übergeben Sie den Rückruf an die Aktivität und lassen Sie ihn das Fragment ersetzen. Erstellen Sie dazu einfach eine Schnittstelle mit Callback und implementieren Sie sie in Activity. Überschreiben Sie dann in Fragment die Funktion onAttach (Aktivität) und speichern Sie die Schnittstelle für onClick

    – Androider

    20. Januar ’14 um 7:57

1641822159 800 Wie ersetze ich ein Fragment beim Klicken auf die Schaltflache
Ahmad Raza

Sie können fragment durch FragmentTransaction ersetzen.

Bitte schön.

Machen Sie eine Schnittstelle.

public interface FragmentChangeListener 
{
    public void replaceFragment(Fragment fragment); 
}

implementiert Ihre Fragment-Halteaktivität mit dieser Schnittstelle.

public class HomeScreen extends FragmentActivity implements
        FragmentChangeListener {


         @Override
         public void replaceFragment(Fragment fragment) {
            FragmentManager fragmentManager = getSupportFragmentManager();;     
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(mContainerId, fragment, fragment.toString());
            fragmentTransaction.addToBackStack(fragment.toString());
            fragmentTransaction.commit();   
    }

}

Rufen Sie diese Methode aus Fragmenten wie folgt auf.

//In deinem Fragment.

public void showOtherFragment()
{
       Fragment fr=new NewDisplayingFragment();
             FragmentChangeListener fc=(FragmentChangeListener)getActivity();
             fc.replaceFragment(fr);
}

Hoffe das wird funktionieren!

HINWEIS: mContainerId ist die ID der Ansicht, die die Fragmente enthält. Sie sollten auch die onString()-Methode von Fragment überschreiben.

  • die Frage ist, wie die Methode in der Aktivität aus dem enthaltenden Fragment aufgerufen wird, nicht wie die Methode aussehen soll

    – Mario Stoilov

    20. Januar ’14 um 8:19

  • @MarioStoilov: Entschuldigung, ich habe meine Antwort aktualisiert. Bitte versuchen Sie es.

    – Ahmad Raza

    20. Januar ’14 um 9:05

  • Sie sollten auch die onString()-Methode von Fragment überschreiben Was bedeutet das?

    – Top-Katze

    21. Januar ’14 um 6:29

  • Durch Überschreiben der onString()-Methode können Sie jedem Fragment einen eindeutigen Namen zuweisen, so wie Sie “myFragment” von der onString()-Methode des Fragments zurückgeben können. Angenommen, Sie müssen ein Fragment in FragmentBackStack suchen. Dann können Sie es mithilfe der onString()-Antwort durchsuchen. Dies ist die Zeichenfolge “myFragment”.

    – Ahmad Raza

    21. Januar ’14 um 19:02

  • Noch ein Zweifel. Jeder Fragmentwert sollte auch für die nächsten Fragmente verfügbar sein. Wie kann ich Argumente an fragment übergeben, wenn ich ‘fc.replaceFragment(fr); ‘? ich habe ‘fragment.setArguments(args); ‘. Jedes Fragment ist separate Klassen.

    – Top-Katze

    22. Januar ’14 um 5:20


1641822159 420 Wie ersetze ich ein Fragment beim Klicken auf die Schaltflache
Tiefes Bhatt

Auch ich lerne Android…

Ich habe das gleiche Problem kürzlich gelöst, “So ändern Sie das Fragment beim Klickereignis der Schaltfläche”.

buttonName.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FragmentTransaction fragmentTransaction = getActivity()
            .getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.frame1, new Homefragment());
        fragmentTransaction.commit();
    }
});

Hier frame1 ist es FrameLayout die in der XML meines DrawerLayers definiert haben.

Also, wann immer ich eine Fragmenttransaktion möchte, verwende ich diesen Code. Jedes Mal wird es ersetzt frame1 anstelle Ihres letzten Fragments.

FragmentTransaction fragmentTransaction = getActivity()
        .getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame1, new newfragment());
fragmentTransaction.commit()

Hoffe das hilft..

Sie können Folgendes verwenden, um ein Fragment beim Klicken auf die Schaltfläche dieses Fragments zu ersetzen:

getFragmentManager().beginTransaction().replace(R.id.main_content, new insertFragmentNameHere()).addToBackStack(null).commit();

  • Willkommen bei Stapelüberlauf! Bitte nicht nur mit Quellcode antworten. Versuchen Sie, eine schöne Beschreibung der Funktionsweise Ihrer Lösung bereitzustellen. Siehe: Wie schreibe ich eine gute Antwort?. Danke

    – sɐunıɔןɐqɐp

    21. August ’18 um 23:41

  1. Definieren Sie eine Schnittstelle und nennen Sie sie IChangeListener (oder so ähnlich) und definieren Sie eine Methode darin, die die Arbeit erledigt (z. changeFragment()) (oder rufen Sie eine andere Methode auf, die die Arbeit erledigt), um das Fragment zu ändern).
  2. Lassen Sie Ihre Aktivität die Schnittstelle implementieren, oder lassen Sie eine anonyme Klasse innerhalb der Aktivität sie implementieren.
  3. Erstellen Sie einen parametrisierten Konstruktor Ihres Fragments, der einen IChangeListener-Parameter akzeptiert.
  4. Übergeben Sie beim Initialisieren des Fragments Ihre IChangeListener-Implementierung (die anonyme Klasse oder die Aktivität, die sie implementiert).
  5. Lassen Sie den onClick-Listener der Schaltfläche die Änderungsmethode des IChangeListener aufrufen.

Ab der Zukunft 2017 und danach gibt es verschiedene Bibliotheken, die auslösen Veranstaltungen mit Bus und jetzt können Sie es verwenden, um der Aktivität mitzuteilen, wenn ein Ereignis in einem Fragment ausgelöst wird, das ihm gehört.

Beziehen auf:

RxBus mit RxJava

Sie können neue von Google vorgeschlagene Architekturen überprüfen

ViewModel

Verwenden Sie nicht den Ansatz in der akzeptierten Antwort, werden Sie mit mehr als 3 verschiedenen Ereignissen aus Fragmenten wirklich hässlich

  • Warum wird dies Ihrer Meinung nach unter das Beobachtermuster fallen? Ich denke, das wird ein Overkill sein

    – Bavan

    29. Okt ’18 um 6:31

1641822159 623 Wie ersetze ich ein Fragment beim Klicken auf die Schaltflache
Ramy Elbouhy

Sie können diesen Code ausprobieren, bei mir funktioniert er einwandfrei, das Layout zum Anzeigen aufblasen, den Button definieren und auf klicken,

Button btn_unstable;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_home,container,false);

    btn_unstable = (Button)view.findViewById(R.id.btn_unstable);
    btn_unstable.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_replace, new UnstableFragment()).commit();

        }
    });
    return view;
}

  • Warum wird dies Ihrer Meinung nach unter das Beobachtermuster fallen? Ich denke, das wird ein Overkill sein

    – Bavan

    29. Okt ’18 um 6:31

.

306560cookie-checkWie ersetze ich ein Fragment beim Klicken auf die Schaltfläche dieses Fragments?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy