2016-11-07 4 views
0

Im начал сегодня wth фрагменты на android (до сих пор я только использовал действия), и я получаю сбой после запуска приложения (на самом деле он даже не запускается).Активность crash (андроидные фрагменты)

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); 
      } 
     }); 
    } 


} 

Я сделал Init() функции andeverything работала хорошо, пока я пытался вызвать его на onCreateView() Я знаю, что эта проблема должна быть, как я называю эту функцию. Буду признателен за любую помощь.

Спасибо.

ответ

0

Вы не можете получить доступ к представлению, что еще не существует, переписать код так:

@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

Работал! Благодаря! – Capie

0

Вид еще не установлен, когда вы вызываете метод init(). Сначала наполните вид, затем либо передайте его в init(), либо сразу получите представление в onCreateView. Верните завышенный вид в конце метода.

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

Код только ответы не приветствуются в SO. – Emmanuel

+0

@ Emmanuel Я обновил свой ответ –

0

Для объяснения код, который написал другие ответы, вы не можете назвать getView() перед тем onCreateView() имеет завершено. Как вы можете видеть в своих предложениях кода, вы должны findViewById() на вид, который вы надули (который вы вернетесь). Когда вы вернете это раздутое представление, оно будет доступно в последующих методах жизненного цикла, вызвав getView().

Смежные вопросы