Fehler beim replacen zweier Fragments

  • Antworten:14
  • Bentwortet
Philipp H
  • Forum-Beiträge: 184

05.04.2015, 15:34:07 via Website

Hallo zusammen,
ich versuche gerade ein App (wer hätte das gedacht) zu entwickeln nur habe ich das Problem das, dass ich wenn ich die App starten möchte folgende Fehlermeldung erhalte. Kann mir einer Sagen wo mein Fehler ist oder einen Lösungsvorschlag nennen. Wenn ihr eine Datei benötigt schreibt es einfach:

Fehler Meldung

Process: nimaldev.de.schuhaustheobald, PID: 26086
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{nimaldev.de.schuhaustheobald/nimaldev.de.schuhhaustheobald.MainActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
        at android.app.ActivityThread.access$900(ActivityThread.java:161)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5356)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at nimaldev.de.schuhhaustheobald.MainFragment.<init>(MainFragment.java:20)
        at nimaldev.de.schuhhaustheobald.MainActivity.<init>(MainActivity.java:11)
        at java.lang.Class.newInstanceImpl(Native Method)
        at java.lang.Class.newInstance(Class.java:1208)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1079)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2222)

            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)

Ein Fehler ist kein Fehler es ist ein Feature///https://play.google.com/store/apps/developer?id=Nimal+Development

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.04.2015, 15:37:00 via Website

Caused by: java.lang.NullPointerException
at nimaldev.de.schuhhaustheobald.MainFragment.(MainFragment.java:20)
at nimaldev.de.schuhhaustheobald.MainActivity.(MainActivity.java:11)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1208)
at android.app.Instrumentation.newActivity(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2222)

Da ist dein Fehler, eine Nullpointer Exception im MainFragment Zeile 20
-> Deine Variable ist NULL obwohl sie es nich sein darf ;)

Wie ist denn der Code?
Zudem ist das Log jetzt nicht schwierig zu lesen.
Zumidest herausfinden wo der Fehler ist, das solltest du können

LG

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

Antworten
Philipp H
  • Forum-Beiträge: 184

05.04.2015, 15:58:45 via Website

Ja ich weiß... Ich kann das auch normal habe das nur irgendwie übersehen. Ich verstehe nur noch nicht so ganz warum. Hier ist der Code :

import android.os.Bundle;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class MainFragment extends Fragment implements View.OnClickListener {

public Button buttonWebshop,buttonNews, buttonAktionen, buttonUeberUns;
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

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



    buttonWebshop = (Button) getView().findViewById(R.id.buttonWebShop);
    buttonNews = (Button) getView().findViewById(R.id.buttonNews);
    buttonAktionen = (Button)getView().findViewById(R.id.buttonAktionen);
    buttonUeberUns = (Button) getView().findViewById(R.id.buttonUeberUns);

    buttonWebshop.setOnClickListener(this);
    buttonNews.setOnClickListener(this);
    buttonAktionen.setOnClickListener(this);
    buttonUeberUns.setOnClickListener(this);





    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_main, container, false);


}


@Override
public void onClick(View v) {
    if(getView() == buttonWebshop)
    {
        WebshopFragment webshopFragment = new WebshopFragment() ;
        ft.replace(R.id.webViewFragment, webshopFragment);


        ft.commit();
    }
}

}

Zeil 20 ist:

FragmentTransaction ft = fm.beginTransaction();

Ein Fehler ist kein Fehler es ist ein Feature///https://play.google.com/store/apps/developer?id=Nimal+Development

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.04.2015, 16:08:34 via Website

Ich seher hier 2 Fehler:

  1. Da der Fehler hier ist: FragmentTransaction ft = fm.beginTransaction();
    ist klar, dass beide zeilen [

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ]
    in die onCreateView müssen.
    Zumindest müssen diese dort initialisiert werden. ob du sie als klassenvariable behalten willst, ist deine Sache.

  2. Um die Buttons auf dem Layout zu finden nutzt zu getView().
    Das ist auch richtig, nur kann es sein, dass die View zu dem Zeitpunkt null ist, da du sie ja noch nicht inflatet hast.
    Also erst inflater.inflate(..)
    und dannach die Buttons suchen.
    Als return gibst du halt die entsprechende View Variable zurück.

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

Antworten
Philipp H
  • Forum-Beiträge: 184

05.04.2015, 16:18:07 via Website

ich habe punkt 2 nicht so ganz verstanden ich habe den code jetzt so geändert:

public class MainFragment extends Fragment implements View.OnClickListener  {

public Button buttonWebshop,buttonNews, buttonAktionen, buttonUeberUns;
FragmentManager fm;
FragmentTransaction ft ;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    fm = getFragmentManager();
    ft = fm.beginTransaction();

    View v;
    v = inflater.inflate(R.layout.fragment_main, container, false);

    buttonWebshop = (Button) getView().findViewById(R.id.buttonWebShop);
    buttonNews = (Button) getView().findViewById(R.id.buttonNews);
    buttonAktionen = (Button)getView().findViewById(R.id.buttonAktionen);
    buttonUeberUns = (Button) getView().findViewById(R.id.buttonUeberUns);

    buttonWebshop.setOnClickListener(this);
    buttonNews.setOnClickListener(this);
    buttonAktionen.setOnClickListener(this);
    buttonUeberUns.setOnClickListener(this);



    // Inflate the layout for this fragment
    return v;
}

@Override
public void onClick(View v) {
    if(getView() == buttonWebshop)
    {

        WebshopFragment webshopFragment = new WebshopFragment() ;
        MainFragment mFragment = new MainFragment();


        ft.replace(R.id.container, webshopFragment);


        ft.commit();
    }
}

}

— geändert am 05.04.2015, 16:19:09

Ein Fehler ist kein Fehler es ist ein Feature///https://play.google.com/store/apps/developer?id=Nimal+Development

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.04.2015, 16:21:57 via Website

Jetzt würde noch interessieren ob es jetzt geht.
Und Punkt 2 hast du richtig umgesetzt.
Das musst du so machen, da getView null ist wenn keine View inflatet wurde.

und das überprüft man anders:

public void onClick(View v) {
if(getView() == buttonWebshop)

so :

public void onClick(View v) {
if(v.getId() == R.id.buttonWebshop) //Hier geht man über die ID nicht über die Objectinstanzen, das führt sonst zu Problemen

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

Antworten
Philipp H
  • Forum-Beiträge: 184

05.04.2015, 16:30:53 via Website

Leider nicht....
Ich bekomme jetzt eine NullPointeException beim initialisiern der Button. Wenn du den Log brauchst einfach bescheid sagen.

Ein Fehler ist kein Fehler es ist ein Feature///https://play.google.com/store/apps/developer?id=Nimal+Development

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.04.2015, 16:33:21 via Website

Dann nimm statt getView() deine iew Variable v also dann v.findViewById usw.
So mache ich es immer.

PS: http://stackoverflow.com/a/9505298
Erst nach der onCreateView im weiteren Verlauf kannst du die getView nutzen, da der getter erst nach der onCreateView gesetzt wird.

LG

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

Antworten
Philipp H
  • Forum-Beiträge: 184

05.04.2015, 16:51:08 via Website

So bekomme keine Fehlermeldung mehr nur habe ich das Problem das meine Button nun nicht mehr angezeigt werden....

Hier einemal das Layout:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="nimaldev.de.schuhhaustheobald.MainFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:orientation="horizontal"
        android:layout_weight="1" >
        <!-- Webshop -->
        <Button
            android:layout_width="0dip"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/buttonWebShop" />


    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:orientation="horizontal"
        android:layout_weight="1" >

        <!-- news -->

        <Button
            android:layout_width="0dip"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/buttonNews" />
        <!-- AUSTHENED -->

        <Button
            android:layout_width="0dip"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/buttonAktionen" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:orientation="horizontal"
        android:layout_weight="1" >
        <!-- AUSTEHEND -->

        <Button
            android:layout_width="0dip"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/buttonUeberUns" />

    </LinearLayout>

PS:
Vielen Dank für die Hilfe!!!

Ein Fehler ist kein Fehler es ist ein Feature///https://play.google.com/store/apps/developer?id=Nimal+Development

Antworten
Philipp H
  • Forum-Beiträge: 184

05.04.2015, 16:55:15 via Website

Ich habe da noch zweiFrage ist es Möglich das man sagen kann das die Seite die eine Webview anzeigen soll vorgeladen wird?

Kann ich dem ganzen Auch eine ActionBar hinzugügen?

— geändert am 05.04.2015, 16:57:16

Ein Fehler ist kein Fehler es ist ein Feature///https://play.google.com/store/apps/developer?id=Nimal+Development

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.04.2015, 16:55:19 via Website

Kein Problem :)
Da deine Fragen ja jetzt beantwortet sind, setzte den Thread doch bitte auf Beantwortet.

Danke

— geändert am 05.04.2015, 17:10:23

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.04.2015, 17:12:59 via Website

Also vorladen geht nicht direkt, aber du kannst die WebView solange ausblenen bis die Seite fertig geladen ist.
Das mit dem fertig geladen bekommst du über einen Callback über den WebViewClient.
Und zur ActionBar:
Normalerweise ist da immer eine ActionBar oben drin. Da wird ja der Apptitel etc angezeigt.
Es sei denn diese wird per Code oder durch Styles ausgeblednet, aber dass kann ich ja so nicht wissen.

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

Antworten
Philipp H
  • Forum-Beiträge: 184

07.05.2015, 20:57:15 via Website

habe ein problem ich muss auf den FragmentTransaction Object aus der Mainactivity zugreifen und will damit dann die ft.replace methode aufrufen kann wenn ich das richtig habe die vorgeladenen fragments lade weil ich sonst ja quasi ne neue instanz erstellen muss mit testfragment = new TextFragment();

Ein Fehler ist kein Fehler es ist ein Feature///https://play.google.com/store/apps/developer?id=Nimal+Development

Antworten