Как перенести некоторые данные в другой фрагмент?

194

Как перенести некоторые данные в другой, Fragmentаналогично тому, как это было сделано extrasдля intents?

Евгений
источник
Я пытаюсь ответить на этот вопрос @ здесь . Я надеюсь, что т работает.
Ожанли

Ответы:

482

Используйте Bundle. Вот пример:

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

Bundle поставил методы для большого количества типов данных. Смотрите это

Затем в вашем Fragment, получить данные (например, в onCreate()методе) с помощью:

Bundle bundle = this.getArguments();
if (bundle != null) {
        int myInt = bundle.getInt(key, defaultValue);
}
Pikaling
источник
1
Привет, спасибо за ваш ответ, но мы должны реализовать что-нибудь вроде Serializable или Parcelable?
Анкит Шривастава
Нет, вам не нужно реализовывать какие-либо классы.
Джин
2
Возможно, вы захотите добавить проверку, чтобы увидеть этот пакет! = Null, прежде чем пытаться что-то из него извлечь?
Нильс
А если у вас есть существующий фрагмент в памяти?
powder366
этот код не работает, не перенаправляет активность на фрагмент с данными
Venkatesh
44

Чтобы еще больше расширить предыдущий ответ, как говорил Анкит, для сложных объектов необходимо реализовать Serializable. Например, для простого объекта:

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

В тебе 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();

в вашем ToFragment:

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

    Bundle args = getArguments();
    MyClass myClass = (MyClass) args
        .getSerializable(TAG_MY_CLASS);
mike.tihonchik
источник
Ты лучший. Спасибо
хэш
1
@Sameera Я обычно просто помещаю строку с моим классом фрагмента, т.е. если у меня есть класс MyFragmentIMGoingTo.java, то тогда мой TAG_TO_FRAGMENT = "MyFragmentIMGoingTo";
mike.tihonchik
Лучше использовать Parcelable, поскольку Google порекомендовал его как более оптимизированный метод сериализации для операционной системы Android.
Gem
16

getArguments () возвращает ноль, потому что «Он ничего не получает»

Попробуйте этот код, чтобы справиться с этой ситуацией

if(getArguments()!=null)
{
int myInt = getArguments().getInt(key, defaultValue);
}
Sakthimuthiah
источник
Привет, спасибо за ваш ответ, но мы должны реализовать что-нибудь вроде Serializable или Parcelable?
Анкит Шривастава
вы уверены? потому что мне пришлось реализовать Serializable / Parcelable, когда я передавал сложные данные между фрагментом и действием с помощью намерения ......
Анкит Шривастава
Я пытался только с простыми значениями. Понятия не имею о Serializable или Parcelable извините
Sakthimuthiah
1
Это должен быть комментарий, а не ответ !!
Gem
14

Полный код передачи данных с использованием фрагмента к фрагменту

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

В пользовательском классе фрагмента

Bundle mBundle = new Bundle();
mBundle = getArguments();
mBundle.getString(key);  // key must be same which was given in first fragment
Ананд Савьяни
источник
где взять viewID?
Ху
@Hoo: пожалуйста, укажите свой вопрос, что вы хотите задать
Ананд Савьяни
Вы можете помочь мне? stackoverflow.com/questions/32983033/…
Ууу
5

Просто расширить предыдущие ответы - это может кому-то помочь. Если вы getArguments()вернетесь null, поместите его в onCreate()метод, а не в конструктор вашего фрагмента:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int index = getArguments().getInt("index");
}
Micer
источник
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
Поясните свой ответ? Код без каких-либо объяснений не сильно поможет
кодер
Я написал код в потоке, чтобы его можно было понять ..... Передача данных из основной деятельности в FragClass1 с использованием пакета.
Сумед Ульх
1

Из класса деятельности:

Отправьте данные, используя аргументы пакета, во фрагмент и загрузите фрагмент

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

Из класса myFragment:

Получить аргументы из пакета и установить их в 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);
Король
источник
Пожалуйста, прочитайте вопрос еще раз, речь идет о фрагменте к фрагменту
Амин Пинджари
1

Вот как вы используете комплект:

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

получить значение из пакета:

 bundle = getArguments();
 if (bundle != null) {
    id = bundle.getInt("id");
 }
Марий челюсть
источник
0

Ваш входной фрагмент

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

        }
    };



}

ваш фрагмент зрения

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
источник
0

Если вы используете график для навигации между фрагментами, вы можете сделать это: Из фрагмента A:

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

К фрагменту Б:

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

Конечно, ваш объект должен реализовывать Serializable

Pesa
источник