Como transferir alguns dados para outro fragmento?

194

Como transferir alguns dados para outro Fragmentda mesma forma que foi feito com extrasa intents?

Eugene
fonte
Eu tento responder a esta pergunta @ aqui . Espero que funcione.
perfil completo de ozhanli

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);
}
Pikaling
fonte
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);
mike.tihonchik
fonte
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);
}
Sakthimuthiah
fonte
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
Anand Savjani
fonte
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");
}
Micer
fonte
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>
Sumedh Ulhe
fonte
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);
WO King
fonte
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");
 }
Marium Jawed
fonte
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;
    }


}
Volverine
fonte
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

Pesa
fonte