Caused by: java.lang.NullPointerException . Kann jemand helfen ?

  • Antworten:30
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 15

26.06.2019, 01:49:01 via Website

Ich habe mir schon den Kopf ausgebrochen wegen diesem Fehler ... Ich weiß der Fehler ist schon oft auf seiten aber irgendwie versteh ich den trotzdem nicht ... Hier ist noch meine Mainactivity und xml datei .... :

    private Button button;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = findViewById(R.id.button1);

    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            openanmeldung();
        }
    });











    BottomNavigationView navigation = findViewById(R.id.bottomnav);
    navigation.setOnNavigationItemSelectedListener(this);


    getSupportFragmentManager().beginTransaction().replace(fragment_container, new Home_Screen()).commit();


}



private void openanmeldung(){
    Intent intent = new Intent(MainActivity.this,AnmeldungButton.class);
    startActivity(intent);
}

Das ist zwar nur ein bischen Code aber ich bin mir sicher da liegt der Fehler :....
Und hier nochmal die xml datei :

<android.support.v7.widget.CardView

        android:layout_width="match_parent"
        android:layout_height="173dp"
        app:cardCornerRadius="8dp"
        android:layout_marginTop="80dp"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        >

    <Button
            android:text="Mehr infos"
            android:layout_width="120dp"
            android:layout_height="35dp"
            android:id="@+id/button1"
            android:layout_weight="1"
            android:layout_marginTop="130dp"
            android:layout_marginRight="170dp"

            />


    <LinearLayout android:layout_height="match_parent"
                  android:layout_width="match_parent"
                  android:background="@color/maincolor"

            >

    </LinearLayout>

    <TextView android:layout_height="wrap_content"
              android:layout_width="wrap_content"
              android:textColor="@color/white"
              android:text="HPI - 29.06.19"
              android:textSize="24dp"
            />

    <TextView android:layout_height="wrap_content"
              android:layout_width="wrap_content"
              android:textColor="@color/white"
              android:text="Sitzung: H-E.51"
              android:textSize="16dp"
              android:layout_marginTop="40dp"

            />
    <TextView android:layout_height="wrap_content"
              android:layout_width="wrap_content"
              android:textColor="@color/white"
              android:text="Juni22, 2019"
              android:textSize="16dp"
              android:layout_marginTop="40dp"
              android:layout_marginRight="20dp"
              android:layout_marginLeft="270dp"






            />
        </android.support.v7.widget.CardView>

Das ist auch nur ein teil der Xml datei aber der Button ist halt das wichtigste .. Und hier nochmal die Java datei zu der Xml datei ... :

package com.example.myapplication2;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class TermineFragment extends Fragment {

@Override


public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);






}



@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.activity_3,container,false);
}

}

Hier noch der fehler :

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
    at com.example.myapplication2.MainActivity.onCreate(MainActivity.java:44)

Ich meine ich habe schon den Fehler gefunden ... Im prinzip unzwar das dieser Setcontent View den Button nicht erkennt da dieser nicht in meiner activity main ist sonder in activity_3 , aber wenn ich activity_3 einsetzte dann erkennt er meine Nav Bar nicht und diese ist in Activity_main.xml drinne und das ist halt im PRinzip das Problem .... Falls ihr mehr braucht für die Problemlösung sende ich es hier rein ich meine Code etc.

Danke für jeden der mir antwortet .... Ich hoffe ihr versteht mich und meinen Fehler ...

Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 775

29.06.2019, 19:51:57 via Website

Dein this im intent ist wieder falsch. Du hast keinen Kontext der activity.
Entweder getActivity. Wenn es geht.
Oder eben den context aus der onattach.
Erstelle eine context variable am Anfang im Klassen Rumpf.
Context context ;

Onattach( Context c) {

context = c;
}

Im listner
Intent(context.this,AnmeldungButton.class)

Oder eben getActivity()

Aber wo ist den der Button den du benutzt in den fragment layout oder in der neuen gestarteten activity? Das wäre interessant um dir richtige Ratschläge zu geben.

Glaube du hast es immer noch nicht verstanden obwohl du es behauptest.

Im fragment brauchst du den Kontext der activity. In der activity reicht this.

Um an den Kontext zu kommen gibt es verschiedene Wege und zwei haben wir dir nun gezeigt.
Im fragment immer den Kontext mit angeben . Nochmal sage ich es nicht.

Die fragment Klasse läuft Inder activity. deshalb der Kontext der activity in dem intent oder find... In der Fragment klasse ist this alleine nicht der context der activity. Sondern des fragment. Solte aber nun wirklich klar sein.

Hilfreich?
Diskutiere mit!
Gelöschter Account
  • Forum-Beiträge: 79

26.06.2019, 08:48:32 via Website

An welcher Stelle tritt der Fehler denn auf? Schon beim starten oder erst, wenn du den Button drückst?

Steht in der Fehlermeldung noch mehr? Mir kommt es so vor, als müsste die länger sein. In der Meldung steht ja auch was von Zeile 44, nur leider stehen hier beim Code keine Zeilennummern dabei...

Eine Sache ist mir an dem Code aufgefallen, die aber eigentlich sogar einen Kompilierfehler auslösen müsste und nicht eine NullPointerException:

private void openanmeldung(){
    Intent intent = new Intent(MainActivity.this,AnmeldungButton.class);
    startActivity(intent);
}

Du übergibst hier dem neuen Intent MainActivity.this, obwohl dort eigentlich nur this stehen müsste.

— geändert am 26.06.2019, 08:50:04

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.479

26.06.2019, 08:58:31 via Website

@Robert: MainActivity.this ist in einer Activity das selbe wie nur this.

@TE:
Der Button auf den du den OnCklickListener setzen willst ist null.
Das heit er wird auf dem Layout der MainActivity nicht gefunden. Ist da ein Button der auch die passende android:id hat?

Zudem sagen die Fehlermeldungen auch in welcher Zeile das Problem ist, damit lässt es sich schneller finden.
Und die Überschattung der Variable Button kann auch zu unschönen Effekten führen...

Ach ja und wenn der Button auf dem Fragment ist musst du den Click auch in der Klasse des Fragments behandeln und den Button auf dem Layout finden.
Layout und Activity/Fragment müssen immer zusammen passen

— geändert am 26.06.2019, 09:00:14

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

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 15

27.06.2019, 01:07:27 via Website

Jo @pascal erstmal danke für deine Antwort und ich kenn auch schon die Zeile wo das Problem ist ...
unzwar in dieser hier : Button button = findViewById(R.id.button1);
Das Problem kenne ich ja schon und die "behandlung" eigentlich ja auch einfach den content view auf die richtige XML datei setzten und das wars ...
Aber ich habe da ja noch die Bottom Nav bar ... Die ist auch noch in der activity main drinne das heißt dann das wenn ich activity main setzen würde dass meine Nav bar dann nicht gehen würde ... Deswegen frage ich ja auch ob man das eventuell anders machen könnte so eine Art oncreate 2 mit einer andere ContentView .. Ich meine ich könnte ja meine Nav bar auch nicht in der acitivty main machen sonder wo anders aber im endeffekt würde das beides nicht zusammenpassen ... Ich will einfach Das mich dieser Button zu einer neuen activity bewegt aber dieser Button ist halt nicht in der activity main ... :(
Trotzdem Danke ich hoffe wir können mein Problem lösen ...

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

27.06.2019, 07:23:21 via Website

Hallo wie dir Pascal schon erklärte verwechselst du Fragment und activity.
Du kannst in der Main acttivity nicht das layout neu laden.
In dem layout in dem der drawer ist, ist auch der Container Platzhalter in dem dein Fragment layout eingeblendet wird.
Das Fragment läuft arber in seiner eigenen klasse innerhalb der activity.
Also deinen Button musst du in der Fragment klasse bearbeiten. Auch dort machst du das findviewbyid musst aber vor dem find... den Context der Aktivity setzen. Wie es Pascal such schon sagte.

Schaue dir das Prinzip Fragment und activity noch mal genauer an. Du hast hier einen großen denkfehler. Ein drawer und nur eine mainactivity ohne Fragment Klasse. Geht nicht.
Auch ist das starten austauschen der Fragmente etwas anders als das starten einer neuen activity. Geht nicht mit einem intent.

— geändert am 27.06.2019, 14:20:13

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 15

28.06.2019, 00:16:30 via Website

Gut ich schaue es mir nochmal genau an also das Fragment und activity unterschied ... Aber kannst du mir eventuell sagen was ich jetzt genau machen soll also was du mit dem Container meinst und so ...
Muss ich jetzt also nichts in meiner Mainactivity machen sondern in der java datei wo meine activity_3 ist machen und den Button dort bestimmen und den onclickListener dort setzen oder wie ... ?
Würde mich über eine weitere Antwort freuen ...

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 15

28.06.2019, 02:28:46 via Website

Ahso und nochmal Pascal ...
Ich verstehe es nicht ganz wie ich jetzt meinen Button in meiner AnmledungButton.java klasse machen soll also was ich hinschreiben soll ....
Weil wenn ich in meiner Klasse schreibe wo ich den Button habe , kann ich nicht findViewById schreiben also es geht nicht ... Ich hoffe ich habe alles richtig verstanden....
Könntest du mir eventeull nochmal den Code schreiben ich glaube es ist nicht viel Code ... Wäre dir aufjedenfall sehr dankbar , da mich dieses Problem lange schon verfolgt und ich gerne weiterkommen möchte ....
Würde mich sehr freuen . Danke !

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

28.06.2019, 07:30:11 via Website

Zum Thema drawer was genau meist du den eigentlich? Welche Art von drawer.

Indem activity layout hast du normalerweise ein layout wo nichts drin ist das ist dein Container in dem dann das layout des Fragment eingeblendet wird.

Ja deinen Button wenn er im Fragment ist muust du auch in der Klasse vom fragment behandeln. Nicht in der activity.
Du brauchst arber der Klasse den Kontext der activity um mit findviewbyid zu arbeiten.

Bin momentan nur Am Handy und da ist coden schlecht.

— geändert am 28.06.2019, 15:09:28

Hilfreich?
Diskutiere mit!
Gelöschter Account
  • Forum-Beiträge: 79

28.06.2019, 08:34:39 via Website

Ich kenne mich mit Fragments nicht so gut aus, aber ich glaube, es ist gemeint, dass du den Button nicht in der MainActivity initialisieren musst, sondern in deiner TermineFragment Klasse.
Es kann sein, dass er "findViewById()" dort nicht kennt, aber soweit ich weiß gibt es im Fragment die Funktion "getActivity()", wo du dann das "findViewById()" hinter setzen kannst. Glaube ich zumindest. ^^

Aber mal eine andere Frage: Was macht deine App eigentlich, bevor man auf den Button drückt? Ist die Einteilung deiner Activity in Fragments überhaupt notwendig? Gerade wenn man mit objektorientierter Programmierung noch nicht so viel Erfahrung hat, sollte man es vielleicht mit Fragments und so nicht übertreiben.
Ein Bekannter von mir hat sich auch Mal die Zähne daran ausgebissen, eine TabbedActivity zu machen, obwohl es dann nachher auch eine einzige Activity getan hat. :)

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.479

28.06.2019, 10:37:05 via Website

@Robert: Nein das ist auch falsch.
Mit getActivity().findView.... holst du wieder Views von der Activity.
Du musst das im Fragment in der onCreate View machen und dabei die View v nehemen die über den Inflater geht.

View v = LayoutInflater.inflate(...)
v.findViewById(R.id.button1);...

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

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.236

28.06.2019, 11:38:16 via Website

@Robert

Wir begrüßen in unserer kleinen Developer-Gruppe jegliche Hilfe für die Fragensteller und du bist herzlichst willkommen.

Jedoch vielleicht wäre es an der einen oder anderen Stelle deinerseits ein wenig sinnvoller,
nur dann auch zu antworten, wenn du dir 100 % sicher bist oder Links / API Dokumentation mit dazu reichst.

"Glaube ich zumindest" oder unkorrekte Darstellungen (hier und anderer Thread) helfen i.d.R nicht weiter.
Es macht auch keinen Sinn , wenn wir einige Antworten von Dir im nachhinein erstmal korrigieren müssen und somit der TE verwirrt wird.

— geändert am 28.06.2019, 12:56:08

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 15

28.06.2019, 15:45:41 via Website

Hallo Pascla nochmal ... Ich verstehe nicht ganz was du mit dem Inflate meinst .. Ich meine ich weiß was das heißt aber ich habe bereits in meiner OnCreateView von meinem TermineFragment.java bereits diesen Code...

package com.example.myapplication2;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class TermineFragment extends Fragment {

private Button button;



@Override

public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);










}



@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.activity_3,container,false);


}

}

Ist dieser Falsch oder was muss ich hier noch was dazufügen ?

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.479

28.06.2019, 16:04:05 via Website

Naja schau her:

public class TermineFragment extends Fragment {

private Button button;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}



@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.activity_3,container,false);
    button = v.findViewById(R.id.button1); //Hier aufs Layout der View v beziehen, und das immer im Fragment, nachdem das als View erstellt wurde

return v; //View zurückgeben

}

}

Ist jetzt klarer geworden was ich mit dem Inflater des Layouts in der onCreateView meine?
Auf diese View musst du dich im Kontext des Fragments beziehen.

Vielleicht schaust du dir wirklich mal die Grunlagen zu Activity und Fragment an. Erst dann versthst du wirklich was du tust.

— geändert am 28.06.2019, 16:05:41

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

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 15

28.06.2019, 16:33:13 via Website

@Jokel ich verstehe nicht ganz was du meinst . Ich brauche einen Kontext in meiner Klasse um mit findviewById arbeiten zu können . Kannst du das bitte noch mal schreiben bzw genauer erklären .. Verstehe wirklich irgendwie nicht was du meinst .
Danke trotzdem

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 15

28.06.2019, 17:01:07 via Website

@Pascal Danke erstmal für den Code und ja ich habe es verstanden , muss nur mal bischen wegen activity und fragment nachhacken aber sonst verstehe ich es ...
Das Problem bei mir ist halt jetzt , dass ich ja will das dieser Button mir eine Activity öfnett und ich habe eigentlich den richtigen Code dazu geschrieben nur erkennt er es irgendwie nicht wenn ich den "Intente"
Hier mal der Code :

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.activity_3,container,false);
button = v.findViewById(R.id.button1);

   button.setOnClickListener(new View.OnClickListener(){

       @Override
       public void onClick(View v) {
           Intent intent = new Intent(TermineFragment.this,AnmeldungButton.class);
           startActivity(intent);
       }
   });


   return v;





}

Mache ich irgendwas falsch ? Bei mir wird diese Zeile nicht erkannt :
new Intent(TermineFragment.this,AnmeldungButton.class);
Also TermineFragment.this,AnmeldungButton.class ist rot unterstrichen und dort steht halt als fehlermeldung :

Cannot resolve constructor 'Intent(com.example.myapplication2.TermineFragment, java.lang.Class)'

Weiß nicht was damit anfangen . Bei Stack meinen sie das ich nur this lassen soll . Habe ich gemacht funkt nicht . Vielelicht kannst du mir weiterhelfen ... :)

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.479

28.06.2019, 17:45:45 via App

Fürs Intent brauchst du wieder die Activity d.h. new Intent(getActivity(),...);

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

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

28.06.2019, 17:45:48 via Website

Was ich mit Content der activity meinte kannst du mit dem view was du in der onCrateView erstellst gleichsetzen.

Zu deinem letzten Code
Mache mal nicht die variable v zweimal, sind zwar verschiedene ist aber unübersichtlich.

Für den intent brauchst du auch das view vom infater.
Eigentlich den Kontext der activity. Kannst es ja mal mit der view testen ob es geht ,ich glaube aber eher nein.

Intent(v.this,AnmeldungButton.class);
Mit v meine ich nicht das v aus dem listner, sondern die view.

Oder den Kontext der activity den du dir mit getActivity() holen kanst.
Problem ist nur das ab API 28 diese Methode depreatet ist.
Deshalb hole ich mir den context immer in der onAttacht Methode und speichere ihn in eine Klassen variable.

Du willst ja aus einem Fragment was in einer activity läuft eine neue activity starten. Deshalb braucht du auch den Bezug zur activity. mit nur this hast du den nicht.

Was hast du bis jetzt für einen Kontext genommen? Ich denke das this und das ist in einer Activity auch richtig. im Fragment ist this alleine nicht richtig. Du brauchst das This der activity also den Kontext.

— geändert am 28.06.2019, 19:06:51

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 775

28.06.2019, 19:58:54 via Website

Verstehe wirklich irgendwie nicht was du meinst .

Ist genau das was pascal für mit der View gezeigt hat.

Nur wenn du nicht mehr in der onCeateView Methode bist hast du die View nicht mehr.
Da für mußt du dir entweder die View in einer Klassen Variablen Speichen. Aber besser und einfacher ist es den context der activity zubenutzrn. Denn du ja für den Intent auch brauchst.

Somit kannst du Dann auch alles in der onActivityCreated machen was der onCreate der activity gleich kommt. Denn für Methode wird aufgerufen dachdem die View also das Layout erstellt wurde.

Schaue dir den livevcyle an.

OnAttach wird noch vor der onCreate aufgerufen und beinhaltet den Context der activity den du sinniger weiße in einer Klassen Variablen speichern solltest. Und so auch überall benutzen kannst.

Wie ich auch schon sagte wird getActivity nicht mehr an api 28 unterstützt. Da bleibt dir nur onAttach.

Ich hoffe es ist nun klar geworden.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 15

28.06.2019, 21:30:43 via Website

@Pascal Perfekt . Hat fast alles geklappt . Habe auch das Intent mit getactivity gemacht und so ...
Nur jetzt kommt leider gottes wieder eine Fehlermeldung unzwar :

at android.support.v4.app.Fragment.startActivity(Fragment.java:1073)
at com.example.myapplication2.TermineFragment$1.onClick(TermineFragment.java:50)

Ich meine im Code scheint kein Fehler zu sein ...
Das ist die 50 Zeile :
Intent intent = new Intent(getActivity(),AnmeldungButton.class);
startActivity(intent);

Die startActivity(intent) ist es ...
Scheint irgendein Fehler zu sein im onclick ...
Weißt du oder andere woran das liegen kann ?

Danke trotzdem schonmal sehr ...

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 15

28.06.2019, 21:39:06 via Website

@Jokel ahsooo , deswegen habe ich ja jetzt auch anscheinend den fehler , da getActivity nicht mehr benutzt wird richtig ? Im code scheint ja alles zu stimmen trotzdem habe ich einen Fehler in meiner onclick methode ...
Das ist interessant .... Nagut unten habe ich mal meinen Fehler beschrieben , habe auch onAttach versucht aber ist irgendwie nicht gegangen bzw hat nicht so funktioniert ... Kann man überhaupt Intent mit Onattach benutzen , da mein Code im moment so aussieht mit onAttach :

@Override
public void onClick(View v) {
Intent intent = new Intent(onAttach(AnmeldungButton.class));
startActivity(intent);
}

Und irgendwie funktioniert es nicht .... Bei mir wird die AnmeldungButton.class rot unterstrichen und als fehler halt wieder der hier :

Cannot resolve method 'onAttach(java.lang.Class)'

Kannst du mir das irgendwie erklären oder einen Link schiken oder so weil getActivity hats geklppt aber der unten gennante fehler kam halt ... Hier ist es der Code ... Weiß echt nicht was abgeht
Trotzdem vielen Danke hoffe noch was von dir zu hören :)

Hilfreich?
Diskutiere mit!