studio setcontentview pasar parametros otro onattach navegar navegacion fragments fragmentos estaticos entre comunicacion activity android

android - setcontentview - Pasar un objeto de una actividad a un fragmento



pasar parametros de un fragment a otro fragment (6)

Tengo una Activity que usa un Fragment . Simplemente quiero pasar un objeto de esta Activity al Fragment .

¿Cómo podría hacerlo? Todos los tutoriales que he visto hasta ahora están recuperando datos de los recursos.

EDITAR:

Seamos un poco más precisos:

Mi actividad tiene un ListView en la parte izquierda. Cuando haces clic en él, la idea es cargar un Fragment en la parte correcta.

Cuando entro en esta Activity , se da una Category Objeto a través del Intent . Este objeto contiene una lista de otras Questions objetos (que contiene una lista de cadenas). Estos objetos de Questions se muestran en el ListView. Cuando hago clic en un elemento de ListView , quiero mostrar la lista de String en el Fragment (en un ListView ).

Para hacer eso, llamo a setContentView() desde mi Activity con un diseño. En este diseño se define el Fragment con la clase correcta para llamar. Cuando llamo a este setContentView() , se onCreateView() de mi Fragment pero en este momento, getArguments() devuelve null.

¿Cómo podría lograr que se llene antes de la llamada de onCreateView() ? (dime si no estoy lo suficientemente claro)

Gracias


Crea un método estático en el Fragment y luego getArguments() usando getArguments() .

Ejemplo:

public class CommentsFragment extends Fragment { private static final String DESCRIBABLE_KEY = "describable_key"; private Describable mDescribable; public static CommentsFragment newInstance(Describable describable) { CommentsFragment fragment = new CommentsFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(DESCRIBABLE_KEY, describable); fragment.setArguments(bundle); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mDescribable = (Describable) getArguments().getSerializable( DESCRIBABLE_KEY); // The rest of your code }

Luego puede llamarlo desde la Activity haciendo algo como:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment fragment = CommentsFragment.newInstance(mDescribable); ft.replace(R.id.comments_fragment, fragment); ft.commit();


Debe crear un método dentro de su fragmento que acepte el tipo de objeto que desea pasar a él. En este caso lo llamé "setObject" (¿eh creativo? :)) Ese método puede realizar cualquier acción que necesite con ese objeto.

MyFragment fragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) { fragment = new MyFragment(); getSupportFragmentManager().beginTransaction().add(android.R.id.content, detailsFragment) .commit(); } else { fragment = (MyFragment) getSupportFragmentManager().findFragmentById( android.R.id.content); } fragment.setObject(yourObject); //create a method like this in your class "MyFragment" }

Tenga en cuenta que estoy usando la biblioteca de soporte y que las llamadas a getSupportFragmentManager () pueden ser solo getFragmentManager () para usted, dependiendo de con qué esté trabajando.


En tu clase de actividad:

public class BasicActivity extends Activity { private ComplexObject co; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_page); co=new ComplexObject(); getIntent().putExtra("complexObject", co); FragmentManager fragmentManager = getFragmentManager(); Fragment1 f1 = new Fragment1(); fragmentManager.beginTransaction() .replace(R.id.frameLayout, f1).commit(); }

Nota: Su objeto debería implementar una interfaz Serializable

Entonces en tu fragmento:

public class Fragment1 extends Fragment { ComplexObject co; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Intent i = getActivity().getIntent(); co = (ComplexObject) i.getSerializableExtra("complexObject"); View view = inflater.inflate(R.layout.test_page, container, false); TextView textView = (TextView) view.findViewById(R.id.DENEME); textView.setText(co.getName()); return view; } }


Obtener referencia del siguiente ejemplo.

1. En fragmento : crea una variable de referencia para la clase cuyo objeto quieres en el fragmento. Simplemente cree un método setter para la variable de referencia y llame al setter antes de reemplazar el fragmento de la actividad.

MyEmployee myEmp; public void setEmployee(MyEmployee myEmp) { this.myEmp = myEmp; }

2. En actividad :

//we need to pass object myEmp to fragment myFragment MyEmployee myEmp = new MyEmployee(); MyFragment myFragment = new MyFragment(); myFragment.setEmployee(myEmp); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.main_layout, myFragment); ft.commit();


Para pasar un objeto a un fragmento, haga lo siguiente:

Primero almacene los objetos en Bundle, no olvide poner los implementos serializables en clase.

CategoryRowFragment fragment = new CategoryRowFragment(); // pass arguments to fragment Bundle bundle = new Bundle(); // event list we want to populate bundle.putSerializable("eventsList", eventsList); // the description of the row bundle.putSerializable("categoryRow", categoryRow); fragment.setArguments(bundle);

Luego recupera los paquetes en Fragment

// events that will be populated in this row mEventsList = (ArrayList<Event>)getArguments().getSerializable("eventsList"); // description of events to be populated in this row mCategoryRow = (CategoryRow)getArguments().getSerializable("categoryRow");


Pasar argumentos por paquete está restringido a algunos tipos de datos. Pero puede transferir cualquier dato a su fragmento de esta manera:

En tu fragmento crea un método público como este

public void passData(Context context, List<LexItem> list, int pos) { mContext = context; mLexItemList = list; mIndex = pos; }

y en su actividad llame a passData () con todos sus tipos de datos necesarios después de instanciar el fragmento

WebViewFragment myFragment = new WebViewFragment(); myFragment.passData(getApplicationContext(), mLexItemList, index); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.my_fragment_container, myFragment); ft.addToBackStack(null); ft.commit();

Observación: Mi fragmento extiende "android.support.v4.app.Fragment", por lo tanto, tengo que usar "getSupportFragmentManager ()". Por supuesto, este principio funcionará también con una clase de fragmento que extienda "Fragmento", pero luego deberá usar "getFragmentManager ()".