2011-08-22 16 views

Respuesta

391

Utilice un Bundle. He aquí un ejemplo: métodos

Fragment fragment = new Fragment(); 
Bundle bundle = new Bundle(); 
bundle.putInt(key, value); 
fragment.setArguments(bundle); 

Bundle ha puestos a la gran cantidad de tipos de datos. Ver this

Luego, en su Fragment, recuperar los datos (por ejemplo, en onCreate() método) con:

Bundle bundle = this.getArguments(); 
if (bundle != null) { 
     int myInt = bundle.getInt(key, defaultValue); 
} 
+0

Hola gracias por su respuesta, pero ¿tenemos que implementar algo como Serializable o Parcelable? –

+0

estoy pasando un ArrayList de un objeto de una clase .. –

+0

No, no es necesario para poner en práctica ninguna clase. Así – Gene

15

getArguments() está volviendo nula porque "Su no recibe nada"

Pruebe este código para manejar esta situación

if(getArguments()!=null) 
{ 
int myInt = getArguments().getInt(key, defaultValue); 
} 
+0

Hola gracias por su respuesta, pero ¿tenemos que implementar algo como Serializable o Parcelable? –

+0

estoy pasando una lista de arrays de un objeto de una clase .. –

+0

¿estás seguro? Porque tuve que implementar Serializable/Parcelable cuando estaba pasando datos complejos entre un fragmento y una actividad mediante el uso de intención ...... –

5

Solo para ampliar pre respuestas viciosas: podría ayudar a alguien. Si sus rendimientos null, ponerlo a onCreate() método y no al constructor de su fragmento:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    int index = getArguments().getInt("index"); 
} 
38

Para extender la respuesta anterior aún más, como Ankit estaba diciendo, por objetos complejos es necesario implementar Serializable. Por ejemplo, por el simple objeto:

public class MyClass implements Serializable { 
    private static final long serialVersionUID = -2163051469151804394L; 
    private int id; 
    private String created; 
} 

En que FromFragment:

Bundle args = new Bundle(); 
args.putSerializable(TAG_MY_CLASS, myClass); 
Fragment toFragment = new ToFragment(); 
toFragment.setArguments(args); 
getFragmentManager() 
    .beginTransaction() 
    .replace(R.id.body, toFragment, TAG_TO_FRAGMENT) 
    .addToBackStack(TAG_TO_FRAGMENT).commit(); 

en su ToFragment:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

    Bundle args = getArguments(); 
    MyClass myClass = (MyClass) args 
     .getSerializable(TAG_MY_CLASS); 
+0

en tu código ¿Qué es 'TAG_TO_FRAGMENT' – kosala

+0

Eres el mejor.Gracias – kosala

+1

@Sameera Normalmente pongo una cadena con mi clase de fragmento, es decir, si tengo la clase MyFragmentIMGoingTo.java entonces mi TAG_TO_FRAGMENT =" MyFragmentIMGoingTo "; –

11

Código completo de datos que pasan utilizando el fragmento a fragmento

Fragment fragment = new Fragment(); // replace your custom fragment class 
Bundle bundle = new Bundle(); 
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
       bundle.putString("key","value"); // use as per your need 
       fragment.setArguments(bundle); 
       fragmentTransaction.addToBackStack(null); 
       fragmentTransaction.replace(viewID,fragment); 
       fragmentTransaction.commit(); 

En la clase fragmento de encargo

Bundle mBundle = new Bundle(); 
mBundle = getArguments(); 
mBundle.getString(key); // key must be same which was given in first fragment 
+0

dónde obtener viewID? – Hoo

+0

@Hoo: por favor especifique su pregunta ¿qué quiere preguntar –

+0

me puede ayudar? https://stackoverflow.com/questions/32983033/pass-data-to-another-fragment-by-swipe-view-with-tab-android-studio-not-button – Hoo

0

Su fragmento de entrada

public class SecondFragment extends Fragment { 


    EditText etext; 
    Button btn; 
    String etex; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.secondfragment, container, false); 
     etext = (EditText) v.findViewById(R.id.editText4); 
     btn = (Button) v.findViewById(R.id.button); 
     btn.setOnClickListener(mClickListener); 
     return v; 
    } 

    View.OnClickListener mClickListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      etex = etext.getText().toString(); 
      FragmentTransaction transection = getFragmentManager().beginTransaction(); 
      Viewfragment mfragment = new Viewfragment(); 
      //using Bundle to send data 
      Bundle bundle = new Bundle(); 
      bundle.putString("textbox", etex); 
      mfragment.setArguments(bundle); //data being send to SecondFragment 
      transection.replace(R.id.frame, mfragment); 
      transection.isAddToBackStackAllowed(); 
      transection.addToBackStack(null); 
      transection.commit(); 

     } 
    }; 



} 

su fragmento de vista

public class Viewfragment extends Fragment { 

    TextView txtv; 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.viewfrag,container,false); 
     txtv = (TextView) v.findViewById(R.id.textView4); 
     Bundle bundle=getArguments(); 
     txtv.setText(String.valueOf(bundle.getString("textbox"))); 
     return v; 
    } 


} 
2
  First Fragment Sending String To Next Fragment 
      public class MainActivity extends AppCompatActivity { 
        private Button Add; 
        private EditText edt; 
        FragmentManager fragmentManager; 
        FragClass1 fragClass1; 


        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
         Add= (Button) findViewById(R.id.BtnNext); 
         edt= (EditText) findViewById(R.id.editText); 

         Add.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           fragClass1=new FragClass1(); 
           Bundle bundle=new Bundle(); 

           fragmentManager=getSupportFragmentManager(); 
           fragClass1.setArguments(bundle); 
           bundle.putString("hello",edt.getText().toString()); 
           FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction(); 
           fragmentTransaction.add(R.id.activity_main,fragClass1,""); 
           fragmentTransaction.addToBackStack(null); 
           fragmentTransaction.commit(); 

          } 
         }); 
        } 
       } 
     Next Fragment to fetch the string. 
      public class FragClass1 extends Fragment { 
        EditText showFrag1; 


        @Nullable 
        @Override 
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

         View view=inflater.inflate(R.layout.lay_frag1,null); 
         showFrag1= (EditText) view.findViewById(R.id.edtText); 
         Bundle bundle=getArguments(); 
         String a=getArguments().getString("hello");//Use This or The Below Commented Code 
         showFrag1.setText(a); 
         //showFrag1.setText(String.valueOf(bundle.getString("hello"))); 
         return view; 
        } 
       } 
    I used Frame Layout easy to use. 
    Don't Forget to Add Background color or else fragment will overlap. 
This is for First Fragment. 
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/activity_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     android:background="@color/colorPrimary" 
     tools:context="com.example.sumedh.fragmentpractice1.MainActivity"> 

     <EditText 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/editText" /> 
     <Button 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:id="@+id/BtnNext"/> 
    </FrameLayout> 


Xml for Next Fragment. 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:background="@color/colorAccent" 
    android:layout_height="match_parent"> 
    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/edtText"/> 

</LinearLayout> 
+2

¿Explica tu respuesta? código sin ninguna explicación no ayudará mucho – Coder

+0

he escrito código en un flujo por lo que podría ser entendido ..... Pasar datos de la actividad principal a FragClass1 con el uso del paquete. –

Cuestiones relacionadas