Communication between Fragments with Eventbus

3

In my application I have 1 activity, and in it using SlidingTabLayout and a TabsAdapter, I'm calling 3 fragments.

When I click the save button, I want to retrieve the contents of the 3 fragments, and I'm using EventBus for this, however:

If I click Save with the selected Tab1, it only returns data from tabs 1 and 2. If I click with the selected tab 2, it saves correctly from all tabs. If I click on tab3, it only reports tab2 and tab3.

What should I do to make it work on all tabs ???

TabsAdapter

public class TabsAdapter extends FragmentStatePagerAdapter {
private Context mContext;
private int codigoEmpresa;
private String[] titles = {"DADOS", "ENDEREÇO", "CONTATOS"};

public TabsAdapter(FragmentManager fm, Context c, int cod) {
    super(fm);

    mContext = c;
    codigoEmpresa = cod;
}

@Override
public Fragment getItem(int position) {
    Fragment frag = null;

    if (position == 0){
        frag  = new DadosEmpresaFrag();
    }
    else if (position == 1) {
        frag = new EnderecoEmpresaFrag();
    }
    else if (position == 2){
        frag = new ContatosEmpresaFrag();
    }

    Bundle b = new Bundle();
    b.putInt("position", position);
    b.putInt("codigo", codigoEmpresa);

    frag.setArguments(b);

    return frag;
}

@Override
public int getCount() {
    return titles.length;
}

@Override
public CharSequence getPageTitle(int position) {
    return (titles[position]);
}
}

My Activity

public class CadastrarAlterarEmpresaActivity extends ActionBarActivity {
int codigoRecebido; 
Button btnSalvar;
BancoDAO bancoDAO;
EmpresaDAO empresaDAO;
Empresa empresa;
private Toolbar mToolbar;
TabsAdapter tabsAdapter;

private SlidingTabLayout mSlidingTabLayout;
private ViewPager mViewPager;

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

    mToolbar = (Toolbar) findViewById(R.id.tb_CadastroEmpresas);
    mToolbar.setTitle("Cadastrar Empresas");
    setSupportActionBar(mToolbar);

    Bundle extras = getIntent().getExtras();
    codigoRecebido = extras.getInt("codigo");

    //TABS
    mViewPager = (ViewPager) findViewById(R.id.vp_tabs);
    tabsAdapter = new TabsAdapter(getSupportFragmentManager(), this, codigoRecebido);
    mViewPager.setAdapter(tabsAdapter);
    mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.stl_tabs);
    mSlidingTabLayout.setDistributeEvenly(true); //deixa todas as abas com o mesmo tamanho
    mSlidingTabLayout.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
    mSlidingTabLayout.setSelectedIndicatorColors(getResources().getColor(R.color.colorAccent));
    mSlidingTabLayout.setViewPager(mViewPager);

    // EventBus register
    EventBus.getDefault().register(CadastrarAlterarEmpresaActivity.this);

    btnSalvar = (Button) findViewById(R.id.btnSalvarEmpresa);

    btnSalvar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            empresa = new Empresa();

            chamaEmpresa();

            final int codigo = empresa.getIdEmpresa();
            final String nome = empresa.getNomeRazao();
            final String endereco = empresa.getRua();
            final int telefone1 = empresa.getTelefone1();
            final int telefone2 = empresa.getTelefone2();
            final int celular1 = empresa.getCelular1();
            final String email = empresa.getEmail();

            bancoDAO = new BancoDAO(CadastrarAlterarEmpresaActivity.this);
            empresaDAO = new EmpresaDAO(bancoDAO.Conexao());
            empresa = new Empresa();
            empresa.setNomeRazao(nome);
            empresa.setRua(endereco);
            empresa.setTelefone1(telefone1);

                    try {
                        empresaDAO.inserirEmpresa(empresa);
                        Toast.makeText(CadastrarAlterarEmpresaActivity.this, "Empresa cadastrada!", Toast.LENGTH_SHORT).show();
                    } catch (Exception ex) {
                        Toast.makeText(CadastrarAlterarEmpresaActivity.this, "Erro ao cadastrar a empresa!", Toast.LENGTH_SHORT).show();
                }
                }
            }

        }
    });

}

@Override
public void onDestroy(){
    super.onDestroy();

    // EventBus unregister
    EventBus.getDefault().unregister(CadastrarAlterarEmpresaActivity.this);
}

//listener
public void chamaEmpresa(){
    MessageEB messageEB = new MessageEB();
    messageEB.setClassTester(DadosEmpresaFrag.class + "");

    EventBus.getDefault().post(messageEB);

    MessageEB messageEB2 = new MessageEB();
    messageEB2.setClassTester(EnderecoEmpresaFrag.class + "");

    EventBus.getDefault().post(messageEB2);

    MessageEB messageEB3 = new MessageEB();
    messageEB3.setClassTester(ContatosEmpresaFrag.class + "");

    EventBus.getDefault().post(messageEB3);

}

public void onEvent(MessageEB mMessageEB){
    if(mMessageEB.getClassTester().equalsIgnoreCase(CadastrarAlterarEmpresaActivity.class+"1")) {
        Log.i("Teste", "Retorno fragment 1");
        empresa.setNomeRazao(mMessageEB.getEmpresa().getNomeRazao());
    }

    if(mMessageEB.getClassTester().equalsIgnoreCase(CadastrarAlterarEmpresaActivity.class+"2")) {
        Log.i("Teste", "Retorno fragment 2");
        empresa.setRua(mMessageEB.getEmpresa().getRua());
    }

    if(mMessageEB.getClassTester().equalsIgnoreCase(CadastrarAlterarEmpresaActivity.class+"3")) {
        Log.i("Teste", "Retorno fragment 3");
        empresa.setTelefone1(mMessageEB.getEmpresa().getTelefone1());
    }
}

}

The first Fragment

public class DadosEmpresaFrag extends Fragment {
EditText edtNomeEmpresa, edtApelidoEmpresa;

private static final String ARG_PARAM1 = "param1";
private static final String CODIGO_EMPRESA = "param2";

private String mParam1;
private int mParam2;

public static DadosEmpresaFrag newInstance(String param1, int param2 ) {
    DadosEmpresaFrag fragment = new DadosEmpresaFrag();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putInt(CODIGO_EMPRESA, param2);
    fragment.setArguments(args);
    return fragment;
}

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

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getInt("codigo");
    }
}

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

    //Register Eventbus
    EventBus.getDefault().register(DadosEmpresaFrag.this);

    // -- inflate the layout for this fragment
    View myInflatedView = inflater.inflate(R.layout.fragment_dados_empresa, container, false);

    edtNomeEmpresa = (EditText) myInflatedView.findViewById(R.id.edtNomeEmpresa);

    BancoDAO bancoDAO = new BancoDAO(getActivity());
    EmpresaDAO empresaDAO = new EmpresaDAO(bancoDAO.Conexao());
    Empresa empresa = empresaDAO.buscarEmpresaId(mParam2);

    if (empresa != null){
        edtNomeEmpresa.setText(empresa.getNomeRazao());
    }

    return myInflatedView;
}

@Override
public void onDestroy() {
    super.onDestroy();

    //Unregister Eventbus
    EventBus.getDefault().unregister(DadosEmpresaFrag.this);
}

public void onEvent(MessageEB mMessageEB) {

    if(mMessageEB.getClassTester().equalsIgnoreCase(DadosEmpresaFrag.class+"")) {
        Log.i("Teste", "Chamando fragment 1");

        Empresa e = new Empresa();
        e.setNomeRazao(edtNomeEmpresa.getText().toString());

        mMessageEB.setEmpresa(e);
        mMessageEB.setClassTester(CadastrarAlterarEmpresaActivity.class + "1");
        EventBus.getDefault().post(mMessageEB);

    }

}

}

The second

public class EnderecoEmpresaFrag extends Fragment {
EditText edtEnderecoEmpresa;

private static final String ARG_PARAM1 = "param1";
private static final String CODIGO_EMPRESA = "param2";

private String mParam1;
private int mParam2;

public static EnderecoEmpresaFrag newInstance(String param1, int param2) {
    EnderecoEmpresaFrag fragment = new EnderecoEmpresaFrag();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putInt(CODIGO_EMPRESA, param2);
    fragment.setArguments(args);
    return fragment;
}

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

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getInt("codigo");
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    //Register Eventbus
    EventBus.getDefault().register(EnderecoEmpresaFrag.this);

    // -- inflate the layout for this fragment
    View myInflatedView = inflater.inflate(R.layout.fragment_endereco_empresa, container, false);

    edtEnderecoEmpresa = (EditText) myInflatedView.findViewById(R.id.edtEnderecoEmpresa);

    BancoDAO bancoDAO = new BancoDAO(getActivity());
    EmpresaDAO empresaDAO = new EmpresaDAO(bancoDAO.Conexao());
    Empresa empresa = empresaDAO.buscarEmpresaId(mParam2);

    if (empresa != null){
        edtEnderecoEmpresa.setText(empresa.getRua());
    }


    return myInflatedView;
}

@Override
public void onDestroy() {
    super.onDestroy();

    //Unregister Eventbus
    EventBus.getDefault().unregister(EnderecoEmpresaFrag.this);
}

public void onEvent(MessageEB mMessageEB) {

    if(mMessageEB.getClassTester().equalsIgnoreCase(EnderecoEmpresaFrag.class+"")) {
        Log.i("Teste", "Chamando fragment 2");
        Empresa e = new Empresa();
        e.setRua(edtEnderecoEmpresa.getText().toString());

        mMessageEB.setEmpresa(e);
        mMessageEB.setClassTester(CadastrarAlterarEmpresaActivity.class + "2");
        EventBus.getDefault().post(mMessageEB);

    }

}
}

and finally the third:

public class ContatosEmpresaFrag extends Fragment {
EditText edtTelefone1;

private static final String ARG_PARAM1 = "param1";
private static final String CODIGO_EMPRESA = "param2";

private String mParam1;
private int mParam2;

public static ContatosEmpresaFrag newInstance(String param1, int param2 ) {
    ContatosEmpresaFrag fragment = new ContatosEmpresaFrag();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putInt(CODIGO_EMPRESA, param2);
    fragment.setArguments(args);
    return fragment;
}

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

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getInt("codigo");
    }
}

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

    //Register Eventbus
    EventBus.getDefault().register(ContatosEmpresaFrag.this);

    // -- inflate the layout for this fragment
    View myInflatedView = inflater.inflate(R.layout.fragment_contatos_empresa, container, false);

    edtTelefone1 = (EditText) myInflatedView.findViewById(R.id.edtTelefone1Empresa);

    //mascaras
    MaskEditTextChangedListener maskTelefone1 = new MaskEditTextChangedListener("(##)#####-####", edtTelefone1);
    edtTelefone1.addTextChangedListener(maskTelefone1);

    BancoDAO bancoDAO = new BancoDAO(getActivity());
    EmpresaDAO empresaDAO = new EmpresaDAO(bancoDAO.Conexao());
    Empresa empresa = empresaDAO.buscarEmpresaId(mParam2);

    if (empresa != null){
        if (empresa.getTelefone1() > 0)
            edtTelefone1.setText(String.valueOf(empresa.getTelefone1()));
        else
            edtTelefone1.setText("");
    }

    return myInflatedView;
}

@Override
public void onDestroy() {
    super.onDestroy();

    //Unregister Eventbus
    EventBus.getDefault().unregister(ContatosEmpresaFrag.this);
}

public void onEvent(MessageEB mMessageEB) {

    if(mMessageEB.getClassTester().equalsIgnoreCase(ContatosEmpresaFrag.class+"")) {
        Log.i("Teste", "Chamando fragment 3");
        Empresa e = new Empresa();
        if (!edtTelefone1.getText().toString().equals(""))
            e.setTelefone1(Integer.valueOf(valorSemMascara(edtTelefone1.getText().toString())));

        mMessageEB.setEmpresa(e);
        mMessageEB.setClassTester(CadastrarAlterarEmpresaActivity.class + "3");
        EventBus.getDefault().post(mMessageEB);
    }

}

private String valorSemMascara(String s) {
    String textoPuro = s.replaceAll("\([^)]*\)", "");
    textoPuro = textoPuro.replace("-", "");
    return textoPuro;
}

}
    
asked by anonymous 13.08.2015 / 18:56

1 answer

1

This behavior is normal for your FragmentStatePagerAdapter . It will always have the instance of its View visible + the previous + the next.

In your case, when you are at first, it only has in memory the next view:

Now,whenthesecondtabisvisible,theothertabsaresaved:

Andfinally,thethirdvisibletabitwillonlyhavethepreviousinstance:

If you have a need to use Tabs , I suggest that you save the information in a centralized location (eg your Activity , or some Manager ), and eliminate this dependency on EventBus to handle / save information.

    
14.08.2015 / 19:26