Eu sou muito novo no uso de Fragments.
Estou apenas tentando construir um aplicativo de amostra simples que usa Fragments. Meu cenário é, tenho duas atividades com um fragmento dentro de cada atividade. O primeiro fragmento possui um texto de edição e um botão. O segundo fragmento tem um textview. Quando eu insiro um nome no texto de edição e clico no botão, a visualização de texto no segundo fragmento deve exibir o nome inserido no texto de edição do primeiro fragmento.
Consegui enviar o valor do primeiro fragmento para sua atividade e, em seguida, dessa atividade para a segunda atividade. Agora, como faço para usar esse valor dentro do segundo fragmento.
Aqui está o código Java :::
package com.example.fragmentexample;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Fragment_1 extends Fragment{
OnFragmentChangedListener mCallback;
// Container Activity must implement this interface
public interface OnFragmentChangedListener {
public void onButtonClicked(String name);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnFragmentChangedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment_fragment_1, container, false);
final EditText edtxtPersonName_Fragment = (EditText) view.findViewById(R.id.edtxtPersonName);
Button btnSayHi_Fragment = (Button) view.findViewById(R.id.btnSayHi);
btnSayHi_Fragment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String name = edtxtPersonName_Fragment.getText().toString();
FragmentManager fm = getFragmentManager();
Fragment_2 f2 = (Fragment_2) fm.findFragmentById(R.id.fragment_content_2);
Activity activity = getActivity();
if(activity != null)
{
Toast.makeText(activity, "Say&ing Hi in Progress...", Toast.LENGTH_LONG).show();
}
if(f2 != null && f2.isInLayout())
{
f2.setName(name);
}
else
{
mCallback.onButtonClicked(name);
}
}
});
return view;
}
}
MainActivity.Java
package com.example.fragmentexample;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Choreographer.FrameCallback;
import android.view.Menu;
public class MainActivity extends Activity implements Fragment_1.OnFragmentChangedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public void onButtonClicked(String name) {
// TODO Auto-generated method stub
Intent i = new Intent(this, SecondActivity.class);
i.putExtra("", name);
startActivity(i);
}
}
SecondActivity.Java
package com.example.fragmentexample;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Bundle b = getIntent().getExtras();
Fragment_2 f2 = new Fragment_2();
f2.setArguments(b);
}
}
Fragment_2.Java
package com.example.fragmentexample;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class Fragment_2 extends Fragment{
View view;
TextView txtName;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
view = inflater.inflate(R.layout.fragment_fragment_2, container, false);
// Exception at this line
String name = getArguments().getString("message");
txtName = (TextView) view.findViewById(R.id.txtViewResult);
txtName.setText(name);
return view;
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
}
public void setName(String name)
{
txtName.setText("Hi " + name);
}
}
Eu recebo a seguinte exceção :::
04-16 18:10:24.573: E/AndroidRuntime(713): FATAL EXCEPTION: main
04-16 18:10:24.573: E/AndroidRuntime(713): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmentexample/com.example.fragmentexample.SecondActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.access$500(ActivityThread.java:122)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.os.Looper.loop(Looper.java:132)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.main(ActivityThread.java:4123)
04-16 18:10:24.573: E/AndroidRuntime(713): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): at java.lang.reflect.Method.invoke(Method.java:491)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-16 18:10:24.573: E/AndroidRuntime(713): at dalvik.system.NativeStart.main(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.setContentView(Activity.java:1786)
04-16 18:10:24.573: E/AndroidRuntime(713): at com.example.fragmentexample.SecondActivity.onCreate(SecondActivity.java:13)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.performCreate(Activity.java:4397)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
04-16 18:10:24.573: E/AndroidRuntime(713): ... 11 more
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: java.lang.NullPointerException
04-16 18:10:24.573: E/AndroidRuntime(713): at com.example.fragmentexample.Fragment_2.onCreateView(Fragment_2.java:24)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:754)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1035)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.app.Activity.onCreateView(Activity.java:4177)
04-16 18:10:24.573: E/AndroidRuntime(713): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664)
04-16 18:10:24.573: E/AndroidRuntime(713): ... 21 more
Como obtenho o valor do pacote em SecondActivity.java para Fragment_2.Java?
fonte
Respostas:
etapa 1. para enviar dados do fragmento para a atividade
etapa 2. para receber esses dados na atividade:
passo 3 . para enviar dados de uma atividade para outra, siga a abordagem normal
etapa 4 para receber esses dados em atividade
Etapa 5. Na atividade, você pode enviar dados para o Fragment com a intenção de:
e para receber em fragmento no método Fragment onCreateView:
fonte
bundle.putString("message", "From Activity");
Conforme observado no site do desenvolvedor
a comunicação entre fragmentos deve ser feita por meio da atividade associada.
Vamos ter os seguintes componentes:
A implementação do FragmentA é:
A implementação de MainActivity é:
A implementação do FragmentB é:
Espero que isso ajude..
fonte
// Em Fragment_1.java
// Em Fragment_2.java
Espero que isso ajude você.
fonte
putString
(ouputInt
) é a resposta!Do site dos desenvolvedores :
Você pode se comunicar entre fragmentos com a ajuda de sua atividade. Você pode se comunicar entre a atividade e o fragmento usando esta abordagem.
Por favor, verifique este link também.
fonte
Em primeiro lugar, todas as respostas estão corretas, você pode passar os dados, exceto objetos personalizados usando
Intent
. Se você deseja passar os objetos personalizados, você deve implementarSerialazable
ouParcelable
para sua classe de objeto personalizado. Achei muito complicado ...Portanto, se seu projeto é simples, tente usar
DataCache
. Isso fornece uma maneira super simples de passar dados. Ref: CachePot do projeto Github1- Defina como Exibir ou Atividade ou Fragmento que enviará dados
2- Obtenha dados em qualquer lugar como abaixo
fonte
A solução mais recente para a passagem de dados entre fragmentos pode ser implementada usando componentes de arquitetura Android, como ViewModel e LiveData. Com esta solução, você não precisa definir a interface para comunicação e pode obter as vantagens de usar viewmodel como sobrevivência de dados devido a alterações de configuração.
Nesta solução, os fragmentos envolvidos na comunicação compartilham o mesmo objeto viewmodel que está vinculado ao seu ciclo de vida de atividade. O objeto do modelo de visualização contém o objeto liveata. Um fragmento define os dados a serem transmitidos ao objeto liveata e os observadores do segundo fragmento mudam e recebem os dados.
Aqui está o exemplo completo http://www.zoftino.com/passing-data-between-android-fragments-using-viewmodel
fonte
Passando argumentos entre fragmentos. É um pouco tarde para responder a esta pergunta, mas pode ajudar alguém!
Fragment_1.java
Então em seu
Fragment_2.java
você pode obter os paramaters normalmente dentro de seuonActivityCreated
exfonte
Acho que uma boa maneira de resolver esse problema é usar uma interface personalizada.
Digamos que você tenha dois fragmentos (A e B) que estão dentro da mesma atividade e você deseja enviar dados de A para B.
Interface:
Atividade:
Fragmento A:
Fragmento B:
fonte
A comunicação entre fragmentos é bastante complicada (acho o conceito de ouvintes um pouco desafiador de implementar).
É comum usar um 'Event Bus "para abstrair essas comunicações. Esta é uma biblioteca de terceiros que cuida dessa comunicação para você.
'Otto' é aquele que é usado frequentemente para fazer isso e pode valer a pena dar uma olhada em: http://square.github.io/otto/
fonte
Passando dados de Fragment para outro Fragment
Do primeiro fragmento
No Segundo Fragmento
fonte
Essa implementação simples ajuda a passar dados entre fragmentos de uma maneira simples. Acha que deseja passar dados de 'Frgment1' para 'Fragment2'
Em Fragment1 (definir dados para enviar)
No método Fragment2 onCreateView (Get Parameteres)
fonte
Maneira Kotlin
Use uma
SharedViewModel
proposta na documentação oficial do ViewModelPrimeiro implemente o fragment-ktx para instanciar seu modelo de visão mais facilmente
Então, você só precisa colocar dentro do viewmodel os dados que você irá compartilhar com o outro fragmento
Então, para terminar, apenas instancie seu viewModel em cada fragmento e defina o valor de
selected
do fragmento que você deseja definir os dadosFragmento A
E então, apenas ouça esse valor no destino do Fragment
Fragmento B
Você também pode fazer isso da maneira oposta
fonte
Solução de trabalho 100%: (se ajudar você, não se esqueça de acertar o voto positivo)
Em seu primeiro fragmento, coloque este trecho de código:
No segundo fragmento, faça o método como abaixo:
em seguida, defina uma variável no nível da classe:
em seguida, faça outro método no segundo fragmento para definir o valor:
fonte
Você pode atingir seu objetivo por ViewModel e Live Data, que é liberado por Arnav Rao . Agora coloquei um exemplo para esclarecê-lo com mais clareza.
Primeiro, o presumido
ViewModel
é nomeadoSharedViewModel.java
.Então, o fragmento de origem é
MasterFragment.java
de onde queremos enviar os dados.E, finalmente, o fragmento de destino é
DetailFragment.java
para onde queremos receber os dados.fonte
OK, depois de tanto cavar aqui, encontrei uma solução simples. Na verdade, você nunca deve passar os dados de um fragmento para outro, é sempre uma má ideia, você pode passar os dados do fragmento A para a atividade e obter os dados da atividade no fragmento B.
// na atividade principal
// agora em FragmentB
fonte
fiz algo realmente fácil para iniciantes como eu .. fiz um textview no meu activity_main.xml e coloquei
então eu recebo esta visualização de texto do primeiro fragmento
e então no segundo fragmento eu obtenho o valor
espero que ajude!
fonte