Como transferir alguns dados para outro fragmento?


Respostas:


482

Use a Bundle. Aqui está um exemplo:

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

O pacote colocou métodos para vários tipos de dados. Veja isto

Em seguida, no seu Fragment, recupere os dados (por exemplo, no onCreate()método) com:

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

1
Olá, obrigado por sua resposta, mas precisamos implementar algo como Serializable ou Parcelable?
Ankit Srivastava

Não, você não precisa implementar nenhuma classe.
Gene

2
Talvez você queira adicionar uma verificação para ver esse pacote! = Nulo antes de tentar obter algo com isso?
Niels

E se você tem um fragmento existente na memória?
powder366

este é o código não trabalhar, não redireccionar a actividade fragmento com dados
Venkatesh

44

Para estender ainda mais a resposta anterior, como dizia o Ankit, para objetos complexos, você precisa implementar o Serializable. Por exemplo, para o objeto simples:

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

Em você 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();

no seu ToFragment:

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

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

Você é o melhor.Obrigado
hash

1
@ Samira Eu normalmente apenas coloco uma string com minha classe de fragmento, ou seja, se eu tiver a classe MyFragmentIMGoingTo.java, então meu TAG_TO_FRAGMENT = "MyFragmentIMGoingTo";
Mike.tihonchik

Melhor usar o Parcelable, como o Google recomendou, como técnica de serialização mais otimizada para o sistema operacional Android.
Gem

16

getArguments () está retornando nulo porque "Não recebe nada"

Experimente este código para lidar com esta situação

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

Olá, obrigado por sua resposta, mas precisamos implementar algo como Serializable ou Parcelable?
Ankit Srivastava

você tem certeza porque eu tive que implementar Serializable / Parcelable quando eu estava passando dados complexos entre um fragmento e uma atividade usando a intenção ......?
Ankit Srivastava

Eu tentei apenas com valores simples. Nenhuma idéia sobre Serializable ou Parcelable desculpe
Sakthimuthiah

1
Deve ser um comentário, não resposta !!
Gem

14

Código completo de transmissão de dados usando fragmento para 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();

Na classe de fragmento personalizado

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

onde obter viewID?
Hoo

@Hoo: por favor, especificar a sua pergunta o que você quer perguntar
Anand Savjani


5

Apenas para estender respostas anteriores - isso poderia ajudar alguém. Se você getArguments()retornar null, coloque-o no onCreate()método e não no construtor do seu fragmento:

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

1
            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>

3
Explique sua resposta? código sem qualquer explicação não vai fazer muita ajuda
Coder

Eu escrevi código em um fluxo para que pudesse ser entendido ... Passando dados da Atividade Principal para o FragClass1 com o uso de pacote.
Sumedh Ulhe

1

Da classe de atividade:

Envie os dados usando argumentos de pacote configurável para o fragmento e carregue o fragmento

   Fragment fragment = new myFragment();
   Bundle bundle = new Bundle();
   bundle.putString("pName", personName);
   bundle.putString("pEmail", personEmail);
   bundle.putString("pId", personId);
   fragment.setArguments(bundle);

   getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    fragment).commit();

Da classe myFragment:

Obtenha os argumentos do pacote configurável e defina-os como xml

    Bundle arguments = getArguments();
    String personName = arguments.getString("pName");
    String personEmail = arguments.getString("pEmail");
    String personId = arguments.getString("pId");

    nameTV = v.findViewById(R.id.name);
    emailTV = v.findViewById(R.id.email);
    idTV = v.findViewById(R.id.id);

    nameTV.setText("Name: "+ personName);
    emailTV.setText("Email: "+ personEmail);
    idTV.setText("ID: "+ personId);

Por favor, leia a pergunta novamente, é sobre fragmento de fragmento
Amin Pinjari

1

É assim que você usa o pacote:

Bundle b = new Bundle();
b.putInt("id", id);
Fragment frag= new Fragment();
frag.setArguments(b);

recuperar valor do pacote configurável:

 bundle = getArguments();
 if (bundle != null) {
    id = bundle.getInt("id");
 }

0

Seu 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();

        }
    };



}

seu 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;
    }


}

0

Se você estiver usando gráfico para navegação entre fragmentos, poderá fazer o seguinte: Do fragmento A:

    Bundle bundle = new Bundle();
    bundle.putSerializable(KEY, yourObject);
    Navigation.findNavController(view).navigate(R.id.contactExtendedFragment, bundle);

Para fragmentar B:

    Bundle bundle = getArguments();
    contact = (DISContact) bundle.getSerializable(KEY);

Obviamente, seu objeto deve implementar Serializable

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.