0

Ich möchte auf eine Aktivitätsmethode (Budgeting.readFromDb()) von einer anderen Aktivität (RemoveStatement) zugreifen. RemoveStatement wird mit einer Absicht von BudgetingFragment (einem Platzhalterfragment in der Budgetierung) ausgeführt.Android: Instanz einer Fragmentaktivität von einer anderen Aktivität abrufen

Wenn ich jedoch versuche, eine Instanz von BudgetingFragment (über getFragmentManager() .findFragmentByTag ("budgetingFragment")) abzurufen, um getActivity() aufzurufen, wird ein Nullobjekt zurückgegeben. Ich kann nicht herausfinden, warum es das macht und wie man es repariert.

Ich habe folgende Dinge ausprobiert.

  1. hinzufügen Tag zu Backstack
  2. Anruf getSupportFragmentManager() executePendingTransactions() nach dem Fragment innerhalb budgetingFragment ersetzen.

Jede Hilfe, um dies zu beheben, würde geschätzt werden.

Methode innerhalb Budgetierung zu ändern Fragment

public void onClickFragment(int id, String arrowDirection){ 
    //Get current Fragment 
    Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.budgetingFragment); 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 


    if (currentFragment instanceof BudgetingOverviewFragment && arrowDirection == "Left"){ 
     IncomeFragment incomeFragment = new IncomeFragment(); 
     transaction.replace(R.id.budgetingFragment, incomeFragment, "budgetingFragment"); 

    } 
    else if (currentFragment instanceof BudgetingOverviewFragment && arrowDirection == "Right"){ 
     ExpenseFragment expenseFragment = new ExpenseFragment(); 
     transaction.replace(R.id.budgetingFragment, expenseFragment, "budgetingFragment"); 
    } 
    else if (currentFragment instanceof IncomeFragment && arrowDirection == "Right"){ 
     BudgetingOverviewFragment overviewFragment = new BudgetingOverviewFragment(); 
     transaction.replace(R.id.budgetingFragment, overviewFragment, "budgetingFragment"); 
    } 
    else{ 
     BudgetingOverviewFragment overviewFragment = new BudgetingOverviewFragment(); 
     transaction.replace(R.id.budgetingFragment, overviewFragment, "budgetingFragment"); 
    } 

    transaction.addToBackStack("budgetingFragment"); 
    transaction.commit(); 
    getSupportFragmentManager().executePendingTransactions(); 

} 

Code innerhalb RemoveStatements onCreate() Methode:

FragmentManager fm = getFragmentManager(); 

    //This Fragment is a null pointer 
    Fragment callingFragment = fm.findFragmentByTag("budgetingFragment"); 

    //This crashes the application as getActivity() is called on a null reference 
    Budgeting budgeting = (Budgeting) callingFragment.getActivity(); 

Antwort

0

Jede Aktivität hat es besitzen FragmentManager. Ihre zweite Aktivität kann also keine "budgetingFragment" finden.

+0

Also, was wäre der beste Ansatz, um die Instanz des Fragments oder sogar die Instanz der Budgetierungsaktivität zu erhalten? Wäre es ratsam, die Instanz des Fragmentmanagers für Budgetierungsaktivitäten an RemoveStatement zu übergeben – JoeScott1232

+0

Fragmente sollten sich nicht bewusst sein (lose Kopplung). Setze Argumente zu Fragmenten in der Host-Aktivität und verwende [Rückrufe] (http://developer.android.com/training/basics/fragments/communicating.html) –

0

Soweit ich sehen kann, Ihre Absicht ist es, das gewählte Fragment von tätigkeit1 in die activity2, korrekt abzurufen?

Nun, werden Sie es nicht durch einen Blick auf activity2 ‚s-Fragment-Manager bekommen, weil es auf einem anderen Kontext von tätigkeit1 ist.

Die empfohlene Art und Weise ist es, alle Daten von dem ausgewählten Fragmente benötigt, zu agglomerieren und zu activity2 während Intent ‚s Definition (link1 oder link2) passieren.

Wenn activity2 erstellt wird, können Sie die Daten bekommen, die zuvor serialisiert, wodurch es auf activity2 verwenden. Sie können auch ein neues Fragment unter activity2 mit einer Ersetzungstransaktion wie in activity1 (link) aufblasen. Beachten Sie, dass Sie dazu die ID R.id.budgetingFragment FrameLayout unter activity2 's Layout benötigen.

+0

Meine Absicht ist es, einen Verweis auf das Budgeting-Klassenobjekt zu bekommen, so dass ich kann seine Methode readFromDb verwenden.Ich dachte ursprünglich, dass dies am einfachsten durch den Aufruf von getActivity() für das Fragment in der Budgetierung geschieht, da dieses Fragment die RemoveStatement-Klasse aufruft. Ich bin nicht wirklich an den Daten interessiert, die das Fragment speichert, sondern an seiner Methode getActivity(). Ich glaube jetzt, dass es leichter ist, diese Referenz an die Budgetierungs-Klasse durch die Absicht zu übergeben, wie Sie es vorgeschlagen haben. Ist es jedoch möglich, BudgetingFragment.getActivity() als Parameter der Absicht zu übergeben? – JoeScott1232

+0

Was passiert, wenn Sie eine * activityDB * erstellen, die mit DB-Instanziierung und Methoden erstellt wurde, die verwendet werden, um * activity1 * und * activity2 * zu erweitern? Mit diesem können Sie die gewünschte Methode - readFromDb() auf beiden Aktivitäten 1 und 2 zugreifen. – ReVs

+0

Ich habe diese Lösung komplett übersehen. Vielen Dank. Ich dachte, dass Datenbanken nicht zwischen Aktivitäten geteilt werden, aber ich habe es geschafft, mit einem SQLite Open Helper Singleton zu teilen. – JoeScott1232

Verwandte Themen