Error calling method on fragment

Asked

Viewed 1,309 times

1

My code below was to do a simple task, when clicking the button change to another screen, but is giving error:

Cannot make a Static Reference to the non-static method chamaCadastro() from the type Mainactivity

I’ve already changed the chamaCadastro to static, but the error changes to:

Cannot make a Static Reference to the non-static method setContentView(int) from the type Actionbaractivity

Follows my code:

MainActivity.java

package br.com.navegandoemtelas;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

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

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }
}

public void chamaMenuPrincipal(){
    setContentView(R.layout.activity_main);
}

public void chamaCadastro(){
    setContentView(R.layout.cadastros);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */

public static class PlaceholderFragment extends Fragment {

    Button btCadastro;

    public PlaceholderFragment() {
    }

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

        btCadastro = (Button) rootView.findViewById(R.id.btCadastrar);
        btCadastro.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                chamaCadastro();                    
            }
        });

        return rootView;
    }
}

}
  • 1

    I recommend creating Classes always in different files after giving import gets much better to work and identify possible errors.

  • @Jamesortiz, are you taking Neri’s course? This way of changing the screen by changing the content with setContentView is typical of him and is bad practice. Create separate activities or Fragments and navigate with startActivity or Fragment change with Fragmentmanager. And if it is Neri’s course, stop now and look for another source :)

2 answers

1


Add this to the Mainactivity class:

public static MainActivity context; 

In the constructor, add the line:

context = this;

And in the "call", use:

context.chamaCadastro();


Truth. Fragments within a class must be static.

  • I did as I said, but by changing the Placeholderfragment class by taking out Static, it gives error just below in public Placeholderfragment(), the error is: This fragment inner class should be static (br.com.navegandoemtelas.MainActivity.PlaceholderFragment)

  • Updated response.

  • That is why they should not be used within a :P class

  • Yes. I also recommend creating a new class.

  • Actually, a new file, because it by itself is a class.

  • leaving how static worked blz. I will try to do also with separate files, to see how it looks. I thank everyone for the help!

Show 1 more comment

1

In theory and practice the best to do is the following:

Change the scope of your method by making Static:

public static void chamaCadastro(){
    setContentView(R.layout.cadastros);
}

Create a separate file called PlaceholderFragment.java and paste the following code there, changing the scope of the class to public class:

public class PlaceholderFragment extends Fragment {

    Button btCadastro;

    public PlaceholderFragment() {
    }

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

        btCadastro = (Button) rootView.findViewById(R.id.btCadastrar);
        btCadastro.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                MainActivity.chamaCadastro();                    
            }
        });

        return rootView;
    }
}

Matter to MainActivity within the PlaceholderFragment.java to gain access to her methods.

Now you can access the method MainActivity.chamaCadastro() as follows as you saw in the full code above:

        @Override
        public void onClick(View v) {
            MainActivity.chamaCadastro();                    
        }

Note: although I do not recommend changing layout in an activity, it is much better to create an Activity for each operation (registration/editing) etc.

  • changing to Static, it gives error in setContentView = Cannot make a static reference to the non-static method setContentView(int) from the type ActionBarActivity

Browser other questions tagged

You are not signed in. Login or sign up in order to post.