Skizo-ozᴉʞS ツ
Skizo-ozᴉʞS ツ

Reputation: 20646

Can't declare a Buttons in a fragment

I'm trying to declare a Button on my APP (It's on a fragment), what I've tried is:

TextView tvPregunta = (TextView) getActivity().findViewById(R.id.tvPregunta);

It does not give me an error, but when I'm launching the APP it does...

My LogCat error is :

01-30 08:22:18.865  16165-16165/joancolmenero.taulaperiodica.com.taulaperiodicaapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: joancolmenero.taulaperiodica.com.taulaperiodicaapp, PID: 16165
java.lang.NullPointerException
        at joancolmenero.taulaperiodica.com.taulaperiodicaapp.JocFragment.seguentelement(JocFragment.java:102)
        at joancolmenero.taulaperiodica.com.taulaperiodicaapp.JocFragment.onCreateView(JocFragment.java:90)
        at android.app.Fragment.performCreateView(Fragment.java:1700)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
        at android.app.BackStackRecord.run(BackStackRecord.java:684)
        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
        at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5102)
        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:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)

This line is the TextView tvPregunta. :

at joancolmenero.taulaperiodica.com.taulaperiodicaapp.JocFragment.seguentelement(JocFragment.java:102)

And this one is seguentelement(); :

at joancolmenero.taulaperiodica.com.taulaperiodicaapp.JocFragment.onCreateView(JocFragment.java:90)

seguentelement() it's a private void created out of onCreateView, so my question is why is this TextView crashing?

I've got a onCreateView where I've got the rootview and the calls of the voids...

onCreateView

  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.joc_fragment, container, false);

// Titol del joc
        TextView tvJuego = (TextView) rootView.findViewById(R.id.tvJuego);
        // shadow del textview
        tvJuego.setShadowLayer(1, 0, 3, Color.GRAY);
        // creem una variable per a cada ib

        // NewGame HIDEEEEEEEEEE
        NewGame = (Button)rootView.findViewById(R.id.btNewGame);
        NewGame.setVisibility(View.INVISIBLE);
        NewGame.setText("");


        // IB --> ID imageButton
        berijuego=(ImageButton)rootView.findViewById(R.id.ibBeriJuego);
        borojuego=(ImageButton)rootView.findViewById(R.id.ibBoroJuego);
        cobajuego=(ImageButton)rootView.findViewById(R.id.ibCobaJuego);
        indijuego=(ImageButton)rootView.findViewById(R.id.ibIndiJuego);
        hidrojuego=(ImageButton)rootView.findViewById(R.id.ibHidroJuego);
        ununjuego=(ImageButton)rootView.findViewById(R.id.ibUnunJuego);
        plutojuego=(ImageButton)rootView.findViewById(R.id.ibPlutoJuego);
        radijuego=(ImageButton)rootView.findViewById(R.id.ibRadiJuego);
        promjuego=(ImageButton)rootView.findViewById(R.id.ibPromJuego);
        sodijuego=(ImageButton)rootView.findViewById(R.id.ibSodiJuego);
        zicrojuego=(ImageButton)rootView.findViewById(R.id.ibZicroJuego);
        molijuego=(ImageButton)rootView.findViewById(R.id.ibMoliJuego);
        // setOnClickListener para todoos
        berijuego.setOnClickListener(this);
        borojuego.setOnClickListener(this);
        cobajuego.setOnClickListener(this);
        indijuego.setOnClickListener(this);
        hidrojuego.setOnClickListener(this);
        ununjuego.setOnClickListener(this);
        plutojuego.setOnClickListener(this);
        radijuego.setOnClickListener(this);
        promjuego.setOnClickListener(this);
        sodijuego.setOnClickListener(this);
        zicrojuego.setOnClickListener(this);
        molijuego.setOnClickListener(this);

        //Nivellactual 12 MAX o aun quedan errores

        if ((nivellactual <= 12) || (errores > 0)) {
            nivellactual = nivellactual + 1;
            seguentelement();
        }

        return rootView;
    }

And then it crashes here :

public void seguentelement() {

    switch (nivellactual) {

        case 1:

            TextView tvPregunta = (TextView) getActivity().findViewById(R.id.tvPregunta);
            String pregunta = ("Quin element és el Hidrògen?");
            tvPregunta.setText(pregunta);
            // int de elemento es la imagebutton
            elementcorrecte = (R.id.ibHidroJuego);

            break;

Hope you can find my error.

Upvotes: 0

Views: 152

Answers (4)

EpicPandaForce
EpicPandaForce

Reputation: 81588

You should use ButterKnife to inject your views into your fragment, like so:

public class YourFragment extends Fragment {
        @InjectView(R.id.btnSave)
        public Button saveButton;

        @OnClick(R.id.btnSave)
        public void save(View view) {
            ...
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.your_fragment, container, false);
            ButterKnife.inject(this, rootView);
            ...
        }
}

Add the following dependency to use it to your build.gradle file:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.jakewharton:butterknife:6.0.0'

Upvotes: 0

JoVer M
JoVer M

Reputation: 180

You should not call getActivity() because it returns the parent Activity and NOT the fragment where your TextField is added.
see http://developer.android.com/reference/android/app/Fragment.html#getActivity%28%29

Instead, you can create a global variable TextField and instantiate it in onCreateView() by calling findViewId() of the rootView.
NOTE: Your TextView is in layout joc_fragment right?

TextView tvPregunta;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
               Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.joc_fragment, container, false);
    ...

    tvPregunta = (TextView) rootView.findViewById(R.id.tvPregunta); // instantiate here
    berijuego=(ImageButton)rootView.findViewById(R.id.ibBeriJuego);

    ...

    return rootView;
}

public void seguentelement() {
    switch (nivellactual) {
        case 1:
            // 
            String pregunta = ("Quin element és el Hidrògen?");
            tvPregunta.setText(pregunta);
            // int de elemento es la imagebutton
            elementcorrecte = (R.id.ibHidroJuego);
            break;
    }
    ...
}

Upvotes: 2

droidd
droidd

Reputation: 1371

Inside Fragment class you will get onViewCreated() override method where you should always initialize your views as in this method you get view object using which you can find your views like :

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    view.findViewById(R.id.yourId).setOnClickListener(this);
    //or
    getActivity().findViewById(R.id.yourId).setOnClickListener(this);

}

Upvotes: 0

Akash
Akash

Reputation: 971

on your seguentelement() method

TextView tvPregunta = (TextView) getActivity().findViewById(R.id.tvPregunta);

here id of tvPregunta not generated so you have to put it on your OnCreateView() like

 TextView tvPregunta = (TextView) rootView.findViewById(R.id.tvPregunta);

Upvotes: 0

Related Questions