Soy bastante nuevo en el uso de Fragmentos.
Solo estoy tratando de crear una aplicación de muestra simple que use Fragments. Mi escenario es que tengo dos actividades con un fragmento dentro de cada actividad. El primer fragmento tiene un texto de edición y un botón. El segundo fragmento tiene una vista de texto. Cuando ingreso un nombre en el texto de edición y hago clic en el botón, la vista de texto en el segundo fragmento debe mostrar el nombre ingresado en el texto de edición del primer fragmento.
Pude enviar el valor del primer fragmento a su actividad y luego de esa actividad a la segunda actividad. Ahora, ¿cómo uso este valor dentro del segundo fragmento?
Aquí está el 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);
}
}
Obtengo la siguiente excepción :::
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
¿Cómo obtengo el valor del paquete en SecondActivity.java al Fragment_2.Java?
fuente
Respuestas:
paso 1. para enviar datos del fragmento a la actividad
paso 2. para recibir estos datos en la actividad:
paso 3 . para enviar datos de una actividad a otra actividad siga el enfoque normal
paso 4 para recibir estos datos en actividad
Paso 5. Desde Actividad, puede enviar datos a Fragment con la siguiente intención:
y para recibir en fragmento en el método Fragment onCreateView:
fuente
bundle.putString("message", "From Activity");
Como se indica en el sitio del desarrollador
la comunicación entre fragmentos debe realizarse a través de la Actividad asociada.
Tengamos los siguientes componentes:
La implementación de FragmentA es:
La implementación de MainActivity es:
La implementación de FragmentB es:
Espero que esto sea de ayuda..
fuente
// En Fragment_1.java
// En Fragment_2.java
Espero que esto te ayude.
fuente
putString
(oputInt
) es la respuesta!Desde el sitio web de desarrolladores :
Puede comunicarse entre fragmentos con la ayuda de su Actividad. Puede comunicarse entre actividad y fragmento utilizando este enfoque.
Consulte también este enlace.
fuente
Primero, todas las respuestas son correctas, puede pasar los datos excepto los objetos personalizados usando
Intent
. Si desea pasar los objetos personalizados, usted tiene que poner en prácticaSerialazable
oParcelable
para su clase de objeto personalizado. Pensé que era demasiado complicado ...Entonces, si su proyecto es simple, intente usar
DataCache
. Eso proporciona una forma súper simple de pasar datos. Ref: Proyecto Github CachePot1- Configure esto para Ver o Actividad o Fragmento que enviará datos
2- Obtenga datos en cualquier lugar como a continuación
fuente
La última solución para pasar datos entre fragmentos se puede implementar mediante el uso de componentes arquitectónicos de Android como ViewModel y LiveData. Con esta solución, no es necesario definir la interfaz para la comunicación y puede obtener las ventajas de usar viewmodel como la supervivencia de datos debido a cambios de configuración.
En esta solución, los fragmentos involucrados en la comunicación comparten el mismo objeto de modelo de vista que está vinculado a su ciclo de vida de actividad. El objeto de modelo de vista contiene un objeto de datos en vivo. Un fragmento establece los datos que se pasarán al objeto de datos en vivo y el segundo fragmento, los observadores de datos en vivo cambian y reciben los datos.
Aquí está el ejemplo completo http://www.zoftino.com/passing-data-between-android-fragments-using-viewmodel
fuente
Pasando argumentos entre fragmentos. Es bastante tarde para responder a esta pregunta, ¡pero podría ayudar a alguien!
Fragment_1.java
Luego, en su
Fragment_2.java
, puede obtener los parámetros normalmente dentro de suonActivityCreated
egfuente
Creo que una buena forma de resolver este problema es utilizar una interfaz personalizada.
Supongamos que tiene dos fragmentos (A y B) que están dentro de la misma actividad y desea enviar datos de A a B.
Interfaz :
Actividad:
Fragmento A:
Fragmento B:
fuente
La comunicación entre fragmentos es bastante complicada (encuentro que el concepto de oyentes es un poco difícil de implementar).
Es común utilizar un "Bus de eventos" para abstraer estas comunicaciones. Esta es una biblioteca de terceros que se encarga de esta comunicación por usted.
'Otto' es uno que se usa a menudo para hacer esto, y podría valer la pena investigarlo: http://square.github.io/otto/
fuente
Pasar datos de un fragmento a otro fragmento
Desde el primer fragmento
En el segundo fragmento
fuente
Esta sencilla implementación ayuda a pasar datos entre fragmentos de una forma sencilla. ¿Cree que desea pasar datos de 'Frgment1' a 'Fragment2'
En Fragment1 (Establecer datos para enviar)
En el método Fragment2 onCreateView (obtener parámetros)
fuente
Camino de Kotlin
Utilice una
SharedViewModel
propuesta en la documentación oficial de ViewModelPrimero implemente fragment-ktx para instanciar su modelo de vista más fácilmente
Luego, solo necesita poner dentro del modelo de vista los datos que compartirá con el otro fragmento
Luego, para terminar, simplemente cree una instancia de su viewModel en cada fragmento y establezca el valor del
selected
fragmento en el que desea configurar los datosFragmento A
Y luego, solo escuche este valor en su destino de Fragmento
Fragmento B
También puedes hacerlo al revés
fuente
Solución de trabajo 100%: (si te ayuda, no olvides votar)
En su primer fragmento, coloque este fragmento de código:
En el segundo fragmento, haga un método como el siguiente:
luego defina una variable a nivel de clase:
luego haga otro método en el segundo fragmento para establecer el valor:
fuente
Puede lograr su objetivo mediante ViewModel y Live Data, que Arnav Rao autoriza . Ahora pongo un ejemplo para aclararlo más nítidamente.
Primero,
ViewModel
se nombra el supuestoSharedViewModel.java
.Entonces, el fragmento de origen es
MasterFragment.java
desde donde queremos enviar los datos.Y finalmente, el fragmento de destino es el lugar
DetailFragment.java
donde queremos recibir los datos.fuente
De acuerdo, después de tanto investigar aquí, encontré una solución simple, en realidad nunca debe pasar los datos de un fragmento a otro, siempre es una mala idea, puede pasar los datos del fragmento A a la actividad y obtener los datos de la actividad en el fragmento B.
// en la actividad principal
// ahora en FragmentB
fuente
Hice algo realmente fácil para principiantes como yo ... hice una vista de texto en mi activity_main.xml y puse
luego obtengo esta vista de texto del primer fragmento
y luego en el segundo fragmento obtengo el valor
¡Espero eso ayude!
fuente