setcontentview pasar parametros otro onattach onactivitycreated fragments example entre comunicacion activity android android-fragments

android - parametros - pasar variables a un fragment



Cómo pasar valores entre fragmentos (11)

Soy bastante nuevo en el uso de Fragmentos.

Solo intento crear una aplicación de muestra simple que use Fragmentos. Mi caso 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 de 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); } }

Fragmento_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 en Fragment_2.Java?


// En Fragment_1.java

Bundle bundle = new Bundle(); bundle.putString("key","abc"); // Put anything what you want Fragment_2 fragment2 = new Fragment_2(); fragment2.setArguments(bundle); getFragmentManager() .beginTransaction() .replace(R.id.content, fragment2) .commit();

// En Fragment_2.java

Bundle bundle = this.getArguments(); if(bundle != null){ // handle your code here. }

Espero que esto te ayude


Como se señaló en el sitio del desarrollador

A menudo, deseará que un Fragmento se comunique con otro, por ejemplo, para cambiar el contenido en función de un evento del usuario. Toda la comunicación de Fragmento a Fragmento se realiza a través de la Actividad asociada. Dos fragmentos nunca deberían comunicarse directamente.

la comunicación entre fragmentos debe hacerse a través de la Actividad asociada.

Tengamos los siguientes componentes:

Una actividad aloja fragmentos y permite la comunicación de fragmentos

FragmentoUn primer fragmento que enviará datos

Segundo fragmento FragmentB que recibirá datos de FragmentA

La implementación de FragmentA es:

public class FragmentA extends Fragment { DataPassListener mCallback; public interface DataPassListener{ public void passData(String data); } @Override public void onAttach(Context context) { super.onAttach(context); // This makes sure that the host activity has implemented the callback interface // If not, it throws an exception try { mCallback = (OnImageClickListener) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString()+ " must implement OnImageClickListener"); } } public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { // Suppose that when a button clicked second FragmentB will be inflated // some data on FragmentA will pass FragmentB // Button passDataButton = (Button)......... passDataButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (view.getId() == R.id.passDataButton) { mCallback.passData("Text to pass FragmentB"); } } }); } }

La implementación de MainActivity es:

public class MainActivity extends ActionBarActivity implements DataPassListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (findViewById(R.id.container) != null) { if (savedInstanceState != null) { return; } getFragmentManager().beginTransaction() .add(R.id.container, new FragmentA()).commit(); } } @Override public void passData(String data) { FragmentB fragmentB = new FragmentB (); Bundle args = new Bundle(); args.putString(FragmentB.DATA_RECEIVE, data); fragmentB .setArguments(args); getFragmentManager().beginTransaction() .replace(R.id.container, fragmentB ) .commit(); } }

La implementación de FragmentB es:

public class FragmentB extends Fragment{ final static String DATA_RECEIVE = "data_receive"; TextView showReceivedData; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_B, container, false); showReceivedData = (TextView) view.findViewById(R.id.showReceivedData); } @Override public void onStart() { super.onStart(); Bundle args = getArguments(); if (args != null) { showReceivedData.setText(args.getString(DATA_RECEIVE)); } } }

Espero que esto sea de ayuda..


Creo que una buena forma de resolver este problema es usar una interfaz personalizada.

Digamos que tiene dos fragmentos (A y B) que están dentro de la misma actividad y desea enviar datos de A a B.

Interfaz :

public interface OnDataSentListener{ void onDataSent(Object data); }

Actividad:

public class MyActivity extends AppCompatActivity{ private OnDataSentListener onDataSentListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_activity); FragmentTransaction trans = getFragmentManager().beginTransaction(); FragmentA fa = new FragmentA(); FragmentB fb = new FragmentB(); fa.setOnDataSentListener(new Listeners.OnDataSentListener() { @Override public void onDataSent(Object data) { if(onDataSentListener != null) onDataSentListener.onDataSent(data); } }); transaction.add(R.id.frame_a, fa); transaction.add(R.id.frame_b, fb); transaction.commit(); } public void setOnDataSentListener(OnDataSentListener listener){ this.onDataSentListener = listener; } }

Fragmento A:

public class FragmentA extends Fragment{ private OnDataSentListener onDataSentListener; private void sendDataToFragmentB(Object data){ if(onDataSentListener != null) onDataSentListener.onDataSent(data); } public void setOnDataSentListener(OnDataSentListener listener){ this.onDataSentListener = listener; } }

Fragmento B:

public class FragmentB extends Fragment{ private void initReceiver(){ ((MyActivity) getActivity()).setOnDataSentListener(new OnDataSentListener() { @Override public void onDataSent(Object data) { //Here you receive the data from fragment A } }); } }


Desde el sitio web de Developers :

A menudo, deseará que un Fragmento se comunique con otro, por ejemplo, para cambiar el contenido en función de un evento del usuario. Toda la comunicación de Fragmento a Fragmento se realiza a través de la Actividad asociada. Dos fragmentos nunca deberían comunicarse directamente.

Puede comunicarse entre fragmentos con la ayuda de su Actividad. Puede comunicarse entre actividad y fragmento utilizando this enfoque.

Por favor, consulte this enlace también.


Esta implementación simple ayuda a pasar datos entre fragmentos de una manera simple. Piensa que quieres pasar datos de ''Frunce1'' a ''Fragment2''

En Fragmento1 (establecer datos para enviar)

Bundle bundle = new Bundle(); bundle.putString("key","Jhon Doe"); // set your parameteres Fragment2 nextFragment = new Fragment2(); nextFragment.setArguments(bundle); FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_drawer, nextFragment).commit();

En el método Fragment2 onCreateView (Get parameteres)

String value = this.getArguments().getString("key");//get your parameters Toast.makeText(getActivity(), value+" ", Toast.LENGTH_LONG).show();//show data in tost


He hecho algo realmente fácil para principiantes como yo. Hice una vista de texto en mi activity_main.xml y puse

id=index visibility=invisible

entonces obtengo esta vista de texto del primer fragmento

index= (Textview) getActivity().findviewbyid(R.id.index) index.setText("fill me with the value")

y luego en el segundo fragmento obtengo el valor

index= (Textview) getActivity().findviewbyid(R.id.index) String get_the_value= index.getText().toString();

¡Espero eso ayude!


La comunicación entre fragmentos es bastante complicada (creo que el concepto de oyentes es un poco difícil de implementar).

Es común usar 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 con frecuencia para hacer esto, y podría valer la pena investigarlo: http://square.github.io/otto/


Pasar datos del Fragmento a otro Fragmento

  • Del primer fragmento

    // Set data to pass MyFragment fragment = new MyFragment(); //Your Fragment Bundle bundle = new Bundle(); bundle.putInt("year", 2017) // Key, value fragment.setArguments(bundle); // Pass data to other Fragment getFragmentManager() .beginTransaction() .replace(R.id.content, fragment) .commit();

  • En el segundo fragmento

    @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = this.getArguments(); if (bundle != null) { Int receivedYear = bundle.getInt("year", ""); // Key, default value } }


Primero todas las respuestas son correctas, puede pasar los datos excepto los objetos personalizados usando Intent . Si desea pasar los objetos personalizados, debe implementar Serialazable o Parcelable a su clase de objeto personalizada. Pensé que era demasiado complicado ...

Entonces, si su proyecto es simple, intente utilizar DataCache . Eso proporciona una forma muy simple para pasar datos. Ref: Proyecto Github CachePot

1- Configure esto como Ver o Actividad o Fragmento que enviará datos

DataCache.getInstance().push(obj);

2- Obtener datos en cualquier lugar como a continuación

public class MainFragment extends Fragment { private YourObject obj; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); obj = DataCache.getInstance().pop(YourObject.class); }//end onCreate() }//end class MainFragment


Pasando argumentos entre fragmentos. ¡Es bastante tarde para responder esta pregunta, pero podría ayudar a alguien! Fragment_1.java

Bundle i = new Bundle(); i.putString("name", "Emmanuel"); Fragment_1 frag = new Fragment_1(); frag.setArguments(i); FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.content_frame , new Fragment_2()) .commit();

Entonces en tu Fragment_2.java puedes obtener los parámetros normalmente dentro de tu onActivityCreated por ejemplo

Intent intent = getActivity().getIntent(); if (intent.getExtras() != null) { String name =intent.getStringExtra("name"); }


paso 1. enviar datos de fragmento a actividad

Intent intent = new Intent(getActivity().getBaseContext(), TargetActivity.class); intent.putExtra("message", message); getActivity().startActivity(intent);

paso 2 .para recibir estos datos en la Actividad:

Intent intent = getIntent(); String message = intent.getStringExtra("message");

paso 3 . para enviar datos de la actividad a otra actividad siga un enfoque normal

Intent intent = new Intent(MainActivity.this, TargetActivity.class); intent.putExtra("message", message); startActivity(intent);

paso 4 para recibir estos datos en actividad

Intent intent = getIntent(); String message = intent.getStringExtra("message");

Paso 5. Desde Activity puedes enviar datos a Fragment con la intención de:

Bundle bundle=new Bundle(); bundle.putString("message", "From Activity"); //set Fragmentclass Arguments Fragmentclass fragobj=new Fragmentclass(); fragobj.setArguments(bundle);

y para recibir en fragmento en el método Fragment onCreateView:

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { String strtext=getArguments().getString("message"); return inflater.inflate(R.layout.fragment, container, false); }