0

Ich recherchierte dieses Problem auf verschiedenen Websites und Fragen hier auf Stapelüberlauf, aber ich konnte keine Lösung finden, die mein Problem gelöst. Ich kämpfe seit einiger Zeit mit diesem Problem, aber kann es einfach nicht lösen.NullPointerException bei der Verwendung von findViewById, um Text aus einem Bundle auf Textview in einer Fragmentklasse

Ich habe zwei Aktivitäten und ein Fragment. Die erste Aktivität (Übersicht) sollte das Fragment in t's onCreate mit einem anderen als dem Standardtext hinzufügen. Die zweite Aktivität (AddCity) sendet diese Textdaten an eine Übersicht mit einer Absicht und einem Bündel. In Übersicht ist die Daten verfügbar und ich es mit myfragment.setArguments(bundle) zum Fragmente senden, aber wenn ich versuche, die Textview in onCreateView mit Bundle bundle = getArguments() zuzugreifen bekomme ich folgende Fehlermeldung:

FATAL EXCEPTION: main 
    Process: com.myapp.www, PID: 19690 
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 

Die Ausnahme tritt bei der folgenden Zeile in StatusFragment :

TextView cityText = (TextView) getView().findViewById(R.id.city_name); 

ich den Ansatz bereits versucht, einen eigenen Konstruktor für die Verwendung, aber soweit ich weiß, Sie sollten einen benutzerdefinierten Konstruktor andere als die leeren Standardkonstruktor in einem Fragment zu vermeiden, und es hat nicht funktioniert.

Meine Klassen sind:

Übersicht:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_overview); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setIcon(R.drawable.myicon); 
     // Create the adapter that will return a fragment for each of the three 
     // primary sections of the activity. 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

     // Set up the ViewPager with the sections adapter. 
     mViewPager = (ViewPager) findViewById(R.id.container); 

     if(getIntent().getExtras() != null){ 
      Bundle extras = getIntent().getExtras(); 

      StatusFragment newFragment = new StatusFragment(); 
      newFragment.setArguments(extras); 

      mSectionsPagerAdapter.addFragment(newFragment, extras.getString("city")); 
     }else{ 
      Log.w("Overview-Bundle", "No Bundle Data"); 
     } 

     mViewPager.setAdapter(mSectionsPagerAdapter); 
    } 

AddCity:

Diese Klasse verwendet ein Verfahren einen JSON-String empfangen und analysieren sie die Daten i an die senden müssen bekommen Fragment. Das funktioniert gut, daher gebe ich nur den entsprechenden Code, wo ich die Absicht zusammenfasse. Obj ist das JSON-Objekt. (Lassen Sie mich wissen, wenn Sie mehr Code benötigen)

Intent i = new Intent(AddCity.this, Overview.class); 
        Bundle bundle = new Bundle(); 
        bundle.putString("city", obj.getString("user_city")); 
        bundle.putString("country", obj.getString("user_ country")); 
        i.putExtras(bundle); 
        startActivity(i); 

StatusFragment:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_for_overview, null); 

     setUI(view); 

     return view; 
    } 

    public void setUI(View view){ 
     if(getArguments() != null) { 

      Bundle bundle = getArguments(); 

      String city = bundle.getString("city"); 
      String country = bundle.getString("country"); 

      TextView cityText = (TextView) getView().findViewById(R.id.city_name); 
      TextView countryText = (TextView) getView().findViewById(R.id.country_name); 

      cityText.setText(city); 
      countryText.setText(country); 

     }else{ 
      Log.w("Arguments", "no arguments"); 
     } 
    } 

Ich würde für jede Antwort dankbar. Lass mich wissen, ob ich mehr Code posten sollte.

Antwort

2

Sie rufen getView(), bevor onCreateView() zurückgegeben wurde, daher der Nullzeiger. In Ihrem Fall können Sie einfach anrufen:

public void setUI(View view){ 
    ... 
    TextView cityText = (TextView) view.findViewById(R.id.city_name); 
    ... 
} 
+0

Danke dies geholfen :) Allerdings verstehe ich nicht, warum die Frage als Duplikat geschlossen wurde „Was für einen Nullpointer ist, und wie kann ich es beheben?“ Ich weiß, was eine NullPointerException ist und warum sie auftritt -... Aber in diesem speziellen Fall mit findviewbyId in einem Fragment war ich nicht sicher, weil ich nie Fragmente vor – boehmP

+0

@boehmP verwendet habe. Ich weiß, dass viele Leute triviale Probleme veröffentlichen im Zusammenhang mit NPE und daher ist es ein allgemeiner Konsens, um Menschen auf diesen Posten zu übertragen. Allerdings habe ich gesehen, dass viele gute Fragen über NPE auch die gleiche Behandlung bekommen. Ich könnte das Problem auf Meta irgendwann aufwerfen. Darüber hinaus stimme ich zu, dass der Beitrag selbst für Anfänger Android Studio-Nutzer nicht wirklich hilfreich ist. – Shaishav

Verwandte Themen