2016-12-01 7 views
0

Ich bekam wirklich anying Problem mit dem Zugriff auf Methoden in Fragment.Android Studio Zugriff auf Fragment-Methode von MainActivity

Fehler, die ich bekam

Prozess: com.crelix.crelix, PID: 18913 java.lang.NullPointerException: Der Versuch, virtuelle Methode ‚Leere com.crelix.crelix.ClickerFragment.refreshViews aufzurufen() 'auf einem Nullobjekt Referenz bei com.clix.clix.NavigationActivity.Refresh (NavigationActivity.java:530) bei com.crelix.celix.NavigationActivity $ 1 $ 1.run (NavigationActivity.java:84) bei android.os. Handler.handleCallback (Handler.java:810) bei android.os.Handler.dispatchMessage (Handler.java:99) bei android.os.Looper.loop (Looper.java:189) bei android.app.ActivityThread.main (ActivityThread.java:5529) bei java.lang.reflect.Method.invoke (Native Methode) bei java.lang.reflect.Method.invoke (Methode.java:372) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java: 950) bei com.android.internal .os.ZygoteInit.main (ZygoteInit.java:745)

Mein Fragment Beispiel:

package com.crelix.crelix; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.widget.CardView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

import org.w3c.dom.Text; 

public class ClickerFragment extends Fragment { 

     public static ClickerFragment newInstance() { 
      ClickerFragment fragment = new ClickerFragment(); 
     return fragment; 
    } 

    public ClickerFragment() { 
    } 

private TextView MoneyText; 
private TextView MoneyPerTapTView; 
private TextView BoxesText; 
private TextView BoxesPerTapTView; 
private ProgressBar progressBar; 

MainHolder Main = new MainHolder(); 

public void refreshViews(){ 
    MoneyText.setText("Money: " +Main.Money[0]); 
    MoneyPerTapTView.setText("$ " + Main.Money[1] + " per tap"); 
    BoxesText.setText("Boxes: " + Main.Boxes[0] + "/100"); 
    BoxesPerTapTView.setText("Points " + Main.Boxes[1] + " per tap"); 
    progressBar.setProgress(Main.Boxes[0]); 
} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_clicker, container, false); 
     MoneyText = (TextView) rootView.findViewById(R.id.MoneyText); 
     MoneyPerTapTView = (TextView) rootView.findViewById(R.id.MoneyPerTapTView); 
     BoxesText = (TextView) rootView.findViewById(R.id.BoxesText); 
     BoxesPerTapTView = (TextView) rootView.findViewById(R.id.BoxesPerTapTView); 
     progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar); 
     return rootView; 
    } 

} 

Und ich möchte den Zugriff auf sie aus MainActivity wie:

public void Refresh() 
{ 
    ClickerFragment ClickerFragment = (ClickerFragment) getSupportFragmentManager().findFragmentById(R.id.ClickerFragment); 
    ClickerFragment.refreshViews(); 
} 

Hier füge ich meine Fragmente

public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 

    Fragment fragment = null; 
    if (id == R.id.nav_clicker) { 
     fragment = new ClickerFragment(); 
    } else if (id == R.id.nav_upgrades) { 
     fragment = new UpgradeFragment(); 
    } else if (id == R.id.nav_warehouse) { 
     fragment = new WarehouseFragment(); 
    } else if (id == R.id.nav_postservice) { 
     fragment = new PostserviceFragment(); 
    } else if (id == R.id.nav_shop) { 
     fragment = new ShopFragment(); 
    } else if (id == R.id.nav_market) { 
     fragment = new MarketFragment(); 
    } else if (id == R.id.nav_workshop) { 
     fragment = new WorkshopFragment(); 
    } else if (id == R.id.nav_garage) { 
     fragment = new GarageFragment(); 
    } else if (id == R.id.nav_museum) { 
     fragment = new MuseumFragment(); 
    } else if (id == R.id.nav_collections) { 
     fragment = new CollectionsFragment(); 
    } 
    if (fragment != null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.frame_container, fragment).commit(); 
    } 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 
+1

Mögliche Duplikate von [Was ist eine NullPointerException, und wie behebe ich es?] (http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-fix-it) –

+0

Das Problem damit ist es nicht zu überprüfen, ob das Fragment sichtbar ist oder die Element wurde noch erstellt. Sehen Sie sich den Lebenszyklus eines Fragments zur weiteren Klärung an, aber der Kern davon ist höchstwahrscheinlich onCreateView hat noch nicht ausgelöst, wenn Sie versuchen, refreshViews aufzurufen. – aminner

+0

@Manza Bearbeitet. ;) – trakasi

Antwort

1

Sie nur findFragmentById wenn das Fragment in der XML-statisch eingebettet wurde dazu verwenden, ein android:id innerhalb einer Aktivität und gegeben.

In Ihrem Fall sieht es so aus, als ob das Fragment zur Laufzeit dynamisch innerhalb einer Aktivität hinzugefügt wurde. So können Sie dieses Fragment von Tag durch Aufruf findFragmentByTag auf dem FragmentManager nachschlagen. In Ihrem onNavigationItemSelected, müssen Sie dies ändern:

public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 
    String TAG = ""; 
    Fragment fragment = null; 
    if (id == R.id.nav_clicker) { 
    fragment = new ClickerFragment(); 
    TAG = "CLICKER_TAG"; 
    } else if (id == R.id.nav_upgrades) { 
    fragment = new UpgradeFragment(); 
    TAG = "UPDATE_TAG"; 
    } 
    // You need to add TAG to another fragment. 
    ... 

    getSupportFragmentManager().beginTransaction(). 
       replace(R.id.frame_container, fragment, TAG). 
       commit(); 
    ... 
    return true; 
} 

Jetzt können Sie das Fragment von Tag-Nachschlag:

ClickerFragment clickerFragment = (ClickerFragment) getSupportFragmentManager() 
                .findFragmentByTag("CLICKER_TAG"); 
// Now you have the fragment 
// But remember to check if the fragment null 
if(clickerFragment != null) { 
    ClickerFragment.refreshViews(); 
} 

mehr bei Creating and Using Fragments lesen.

0

Ersetzen Sie Ihre MainActivity Code mit

ClickerFragment ClickerFragment = (ClickerFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.frame_container); 
+0

Danke, aber immer noch gleicher Fehler: / – trakasi

0

Sie können dies in Ihrem onNavigationItemSelected für alle Ihre Fragments bei Bedarf

Fragment fragment = null; 
String tag = null; 
if (id == R.id.nav_clicker) { 
    fragment = new ClickerFragment(); 
    tag = "ClickerFragment"; 
} 
... 
if (fragment != null) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    //Add a tag parameter 
    fragmentManager.beginTransaction() 
     .replace(R.id.frame_container, fragment, tag).commit(); 
} 

In Ihrer Refresh Methode tut dies

public void Refresh() 
{ 
    ClickerFragment ClickerFragment = (ClickerFragment) getSupportFragmentManager().findFragmentByTag("ClickerFragment"); 
    ClickerFragment.refreshViews(); 
} 
Verwandte Themen