Gostaria de acrescentar aos iniciantes que a diferença entre as 2 respostas mais votadas aqui é dada pelo uso diferente de um fragmento.
Se você usar o fragmento na classe java em que possui os dados que deseja transmitir, poderá aplicar a primeira resposta para transmitir dados:
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
Se, no entanto, você usar, por exemplo, o código padrão fornecido pelo Android Studio para fragmentos com guias, esse código não funcionará.
Ele não funcionará mesmo se você substituir o PlaceholderFragment padrão por seu FragmentClasses e mesmo se você corrigir o FragmentPagerAdapter na nova situação, adicionando uma opção para getItem () e outra opção para getPageTitle () (como mostrado aqui )
Aviso: o clipe mencionado acima possui erros de código, que explicarei mais adiante aqui, mas é útil para ver como você passa do código padrão para o código editável para fragmentos com guias)! O restante da minha resposta faz muito mais sentido se você considerar as classes java e os arquivos xml desse clipe (representativo do primeiro uso de fragmentos de guias em um cenário para iniciantes).
O principal motivo pelo qual a resposta mais votada desta página não funcionará é que nesse código padrão para fragmentos com guias, os fragmentos são usados em outra classe java: FragmentPagerAdapter!
Portanto, para enviar os dados, você é tentado a criar um pacote no MotherActivity e passá-lo no FragmentPagerAdapter, usando a resposta no.2.
Só que está errado de novo. ( Provavelmente você poderia fazer assim, mas é apenas uma complicação que não é realmente necessária ).
A maneira correta / mais fácil de fazer isso, eu acho, é passar os dados diretamente para o fragmento em questão, usando a resposta no.2. Sim, haverá um forte acoplamento entre a Atividade e o Fragmento, MAS, para fragmentos com guias, isso é o esperado. Eu aconselho você a criar os fragmentos com guias dentro da classe java MotherActivity (como subclasses, pois nunca serão usados fora da MotherActivity) - é fácil, basta adicionar dentro da classe java MotherActivity quantos fragmentos precisar, como este:
public static class Tab1 extends Fragment {
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
return rootView;
}
}.
Portanto, para passar dados da MotherActivity para um fragmento, será necessário criar Strings / Bundles particulares acima da atividade onCreate da sua Mãe - que você pode preencher com os dados que deseja passar aos fragmentos e transmiti-los através de um método criado após o onCreate (aqui chamado getMyData ()).
public class MotherActivity extends Activity {
private String out;
private Bundle results;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mother_activity);
// for example get a value from the previous activity
Intent intent = getIntent();
out = intent.getExtras().getString("Key");
}
public Bundle getMyData() {
Bundle hm = new Bundle();
hm.putString("val1",out);
return hm;
}
}
E então na classe fragment, você usa getMyData:
public static class Tab1 extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);
MotherActivity activity = (MotherActivity)getActivity();
Bundle results = activity.getMyData();
String value1 = results.getString("val1");
output.setText(value1);
return rootView;
}
}
Se você tiver consultas ao banco de dados, aconselho que você as faça no MotherActivity (e transmita seus resultados como Strings / Inteiros anexados a chaves dentro de um pacote, como mostrado acima), como dentro dos fragmentos com guias, sua sintaxe se tornará mais complexa (isso se torna getActivity () por exemplo, e getIntent se torna getActivity (). getIntent), mas você também tem a opção de fazer o que quiser.
Meu conselho para iniciantes é focar em pequenos passos. Primeiro, obtenha sua intenção de abrir uma atividade com guias muito simples, sem passar QUALQUER dado. Funciona? Abre as guias que você espera? Se não, por que?
Comece com isso e, aplicando soluções como as apresentadas neste clipe , veja o que está faltando. Para esse clipe específico, o mainactivity.xml nunca é mostrado. Isso certamente vai confundir você. Mas se você prestar atenção, verá que, por exemplo, o contexto (tools: context) está errado nos arquivos de fragmento xml. Cada XML de fragmento precisa apontar para a classe de fragmento correta (ou subclasse usando o separador $).
Você também verá que na classe java de atividade principal você precisa adicionar tabLayout.setupWithViewPager (mViewPager) - logo após a linha TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); sem essa linha, sua visualização não está realmente vinculada aos arquivos XML dos fragmentos, mas mostra APENAS o arquivo xml da atividade principal.
Além da linha na classe java de atividade principal, no arquivo XML de atividade principal, você precisa alterar as guias para se adequar à sua situação (por exemplo, adicionar ou remover TabItems). Se você não possui guias no XML da atividade principal, possivelmente não escolheu o tipo de atividade correto quando o criou em primeiro lugar (nova atividade - atividade com guias).
Observe que nos últimos 3 parágrafos eu falo sobre o vídeo! Então, quando digo XML de atividade principal, é o XML de atividade principal no vídeo, que na sua situação é o arquivo XML de MotherActivity.