Bazı veriler başka bir Fragman'a nasıl aktarılır?


194

Nasıl başka bazı veri aktarmak için Fragmentaynı şekilde o ile yapıldı extrasiçin intents?


Bu soruyu @ burada cevaplamaya çalışıyorum . Umarım işe yaramaz.
ozhanli

Yanıtlar:


482

A kullanın Bundle. İşte bir örnek:

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

Bundle, birçok veri türü için yöntemler koymuştur. Bkz bu

Ardından Fragment, verilerinizi (örn. onCreate()Yöntemde) aşağıdakilerle alın:

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

1
Merhaba cevabınız için teşekkür ederim ama Serializable veya Parcelable gibi bir şey uygulamamız gerekiyor mu?
Ankit Srivastava

Hayır, herhangi bir sınıf uygulamanız gerekmez.
Gene

2
Bu paketi görmek için bir kontrol eklemek isteyebilir! = Bir şey çıkarmaya çalışmadan önce null?
Niels

Ve hafızada mevcut bir parçanız varsa?
powder366

bu kod çalışmıyor, etkinliği verilerle parçalara yönlendirmiyor
Venkatesh

44

Ankit'in söylediği gibi önceki cevabı daha da genişletmek için karmaşık nesneler için Serializable'ı uygulamanız gerekiyor. Örneğin, basit nesne için:

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

Sizden

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'ınızda:

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

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

Teşekkürler
Hash

1
@Sameera Genellikle sadece benim parça sınıf ile bir dize koymak, yani sınıf MyFragmentIMGoingTo.java varsa o zaman benim TAG_TO_FRAGMENT = "MyFragmentIMGoingTo";
mike.tihonchik

Google'ın android işletim sistemi için daha optimize serileştirme tekniği olarak önerdiği gibi daha iyi kullanım Parcelable.
Gem

16

getArguments () null döndürüyor çünkü "Onun hiçbir şey almıyor"

Bu durumu ele almak için bu kodu deneyin

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

Merhaba cevabınız için teşekkür ederim ama Serializable veya Parcelable gibi bir şey uygulamamız gerekiyor mu?
Ankit Srivastava

emin misiniz? çünkü ben bir parça ve bir aktivite arasında karmaşık veri niyetini kullanarak geçirirken Seri / uygulanabilir Parcelable uygulamak zorunda ......
Ankit Srivastava

sadece basit değerlerle denedim. Serializable or Parcelable özür dilerim
Sakthimuthiah

1
Cevap değil bir yorum olmalı !!
Gem

14

Parçadan parçaya veri aktarmanın tam kodu

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

Özel parça sınıfında

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

viewID nereden alınır?
Hoo

@Hoo: lütfen sorunuzu ne sormak istediğinizi belirtin
Anand Savjani

bana yardım eder misiniz? stackoverflow.com/questions/32983033/…
Hoo

5

Sadece önceki cevapları uzatmak - birisine yardımcı olabilir. İadeleriniz varsa, getArguments()parçanızın yapıcısına değil, yönteme nullkoyun onCreate():

@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
Cevabını açıkla? herhangi bir açıklama yapmadan kod pek yardımcı olmaz
Coder

i anlaşılabilir böylece bir akış kod yazdım ..... Paketin kullanımı ile ana faaliyet FragClass1 veri aktarma.
Sumedh Ulhe

1

Etkinlik Sınıfından:

Parçayı paket bağımsız değişkenlerini kullanarak veri gönderme ve parçayı yükleme

   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 Sınıfından:

Bağımsız değişkenleri paketten alın ve xml olarak ayarlayın

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

Lütfen soruyu tekrar okuyun, Bu, parçalara
ayrılmakla ilgilidir

1

Paketi şu şekilde kullanırsınız:

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

paketten değer al:

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

0

Giriş parçanız

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

        }
    };



}

bakış parçan

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

Parçalar arasında gezinmek için grafik kullanıyorsanız şunları yapabilirsiniz: A parçasından:

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

B fragmanına:

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

Tabii ki nesneniz Seri hale getirilebilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.