Làm thế nào để chuyển một số dữ liệu sang một mảnh khác?


194

Làm thế nào để chuyển một số dữ liệu sang một dữ liệu Fragmenttương tự như vậy nó đã được thực hiện extrascho intents?


Tôi cố gắng trả lời câu hỏi này @ tại đây . Tôi hy vọng t hoạt động.
ozhanli

Câu trả lời:


482

Sử dụng a Bundle. Đây là một ví dụ:

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

Gói đã đặt phương thức cho nhiều loại dữ liệu. Xem cái này

Sau đó, trong của bạn Fragment, lấy dữ liệu (ví dụ: trong onCreate()phương thức) với:

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

1
Xin chào thanx cho câu trả lời của bạn nhưng chúng ta có cần phải thực hiện bất cứ điều gì không ?? như Nối tiếp hoặc Parcelable ??
Ankit Srivastava

Không, bạn không cần phải thực hiện bất kỳ lớp nào.
Gene

2
Có thể muốn thêm một kiểm tra để xem gói đó! = Null trước khi bạn cố gắng lấy bất cứ thứ gì ra khỏi nó?
Niels

Và nếu bạn có một đoạn hiện có trong bộ nhớ?
bột366

đây là mã không hoạt động, không chuyển hướng hoạt động thành đoạn với dữ liệu
Venkatesh

44

Để mở rộng câu trả lời trước đó nhiều hơn, như Ankit đã nói, đối với các đối tượng phức tạp, bạn cần triển khai Nối tiếp. Ví dụ, đối với đối tượng đơn giản:

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

Trong bạn 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();

trong ToFragment của bạn:

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

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

Bạn là người giỏi nhất. Cảm ơn
băm

1
@Sameera Tôi thường chỉ đặt một chuỗi với lớp phân mảnh của mình, tức là nếu tôi có lớp MyFragmentIMGoingTo.java thì TAG_TO_FRAGMENT của tôi = "MyFragmentIMGoingTo";
mike.tihonchik

Sử dụng tốt hơn Parcelable vì google khuyến nghị nó như là kỹ thuật tuần tự hóa được tối ưu hóa hơn cho hệ điều hành Android.
Đá quý

16

getArgument () đang trả về null vì "Nó không nhận được gì"

Hãy thử mã này để xử lý tình huống này

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

Xin chào thanx cho câu trả lời của bạn nhưng chúng ta có cần phải thực hiện bất cứ điều gì không ?? như Nối tiếp hoặc Parcelable ??
Ankit Srivastava

bạn có chắc không? bởi vì tôi đã phải triển khai Nối tiếp / Parcelable khi tôi chuyển dữ liệu phức tạp giữa một đoạn và một hoạt động bằng cách sử dụng ý định ......
Ankit Srivastava

tôi đã thử với các giá trị đơn giản. Không có ý tưởng về Xin lỗi nối tiếp hoặc Parcelable xin lỗi
Sakthimuthiah

1
Nó nên là một bình luận không trả lời !!
Đá quý

14

Hoàn thành mã truyền dữ liệu bằng cách sử dụng phân đoạn

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

Trong lớp phân đoạn tùy chỉnh

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

lấy viewID ở đâu?
Hoo

@Hoo: vui lòng chỉ định câu hỏi của bạn những gì bạn muốn hỏi
Anand Savigate

Bạn có thể giúp tôi được không? stackoverflow.com/questions/32983033/...
Hoo

5

Chỉ cần mở rộng câu trả lời trước - nó có thể giúp ai đó. Nếu bạn getArguments()trả về null, hãy đặt nó vào onCreate()phương thức và không cho hàm tạo của đoạn của bạn:

@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
Giải thich câu trả lơi của bạn? mã mà không bất kỳ lời giải thích sẽ không làm được gì nhiều giúp đỡ
Coder

tôi đã viết mã trong một luồng để có thể hiểu được ..... Truyền dữ liệu từ Hoạt động chính sang FragClass1 bằng cách sử dụng gói.
Sumedh Ulhe

1

Từ lớp hoạt động:

Gửi dữ liệu bằng cách sử dụng các đối số bó cho đoạn và tải đoạn

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

Từ lớp myFragment:

Lấy các đối số từ gói và đặt chúng thành 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);

Xin vui lòng đọc lại câu hỏi, Đó là về mảnh vỡ
Amin Pinjari

1

Đây là cách bạn sử dụng gói:

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

lấy giá trị từ gói:

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

0

Đoạn đầu vào của bạn

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

        }
    };



}

đoạn nhìn của bạn

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

Nếu bạn đang sử dụng biểu đồ để điều hướng giữa các đoạn, bạn có thể thực hiện việc này: Từ đoạn A:

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

Đến đoạn B:

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

Tất nhiên đối tượng của bạn phải thực hiện nối tiếp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.