2016-11-07 1 views
0

Ich begann heute mit Fragmenten auf Android (bis jetzt habe ich nur Aktivitäten verwendet) und ich bekomme einen Absturz nach dem Ausführen der App (eigentlich startet es nicht sogar).Aktivität Absturz (Android-Fragmente)

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 


/** 
* A simple {@link Fragment} subclass. 
*/ 
public class MainFragment extends Fragment { 


    public MainFragment() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     init();//----> PROBLEM HERE 
     return inflater.inflate(R.layout.fragment_main, container, false); 

    } 


    public TextView login; 
    /** Called when the user clicks link for Login/Register on right corner of the app*/ 
    public void init() { 
     login=(TextView) getView().findViewById(R.id.textView11_linkRegister); 
     login.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //intent means what i want to do' 
       Intent openLoginForm = new Intent(getActivity(),Login.class); 
       startActivity(openLoginForm); 
      } 
     }); 
    } 


} 

Ich habe die Init() Funktion andeverything gut gearbeitet, bis ich es auf onCreateView() zu nennen versucht, weiß ich, das Problem ist die Art, wie ich diese Funktion aufrufen muss. Ich würde jede Hilfe zu schätzen wissen.

THanks.

Antwort

0

Sie können keine Ansicht zugreifen, die noch nicht existiert, schreiben Sie den Code wie folgt aus:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.fragment_main,container,false); 
    init(v);//----> PROBLEM HERE 
    return v; 

} 


public TextView login; 
/** Called when the user clicks link for Login/Register on right corner of the app*/ 
public void init(View v) { 
    login=(TextView) v.findViewById(R.id.textView11_linkRegister); 
    login.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //intent means what i want to do' 
      Intent openLoginForm = new Intent(getActivity(),Login.class); 
      startActivity(openLoginForm); 
     } 
    }); 
} 
+0

Arbeitete! Vielen Dank! – Capie

0

Die Sicht ist noch nicht festgelegt, wenn Sie die init() -Methode aufrufen. Die Ansicht zuerst aufblasen und dann entweder an die init() übergeben oder direkt in der onCreateView anzeigen lassen. Geben Sie die aufgeblähte Ansicht am Ende der Methode zurück.

View view = inflater.inflate(R.layout.fragment_main, container, false); 
login= (TextView) view.findViewById(R.id.textView11_linkRegister); 
login.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //intent means what i want to do' 
      Intent openLoginForm = new Intent(getActivity(),Login.class); 
      startActivity(openLoginForm); 
     } 
    }); 

return view; 
+0

Code nur Antworten sind in SO entmutigt. – Emmanuel

+0

@Emmanuel Ich habe meine Antwort aktualisiert –

0

den Code zu erklären, die anderen Antworten geschrieben haben, können Sie nicht getView() aufrufen, bevor onCreateView() hat abgeschlossen. Wie Sie in ihren Code-Vorschlägen sehen können, müssen Sie findViewById() auf eine Ansicht, die Sie aufgebläht haben (die Sie zurückgeben werden). Wenn Sie diese aufgeblähte Ansicht zurückgeben, ist sie dann in späteren Lebenszyklusmethoden verfügbar, indem Sie getView() aufrufen.