2011-08-22 30 views

Trả lời

391

Sử dụng Bundle. Dưới đây là 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 this

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

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

Hi thanx cho câu trả lời của bạn nhưng chúng ta cần phải thực hiện bất cứ điều gì ?? như Serializable hoặc Parcelable ?? –

+0

tôi đang chuyển danh sách mảng của đối tượng của một lớp .. –

+0

Không, bạn không cần triển khai bất kỳ lớp nào. – Gene

15

getArguments() được trở về null vì "nó không nhận được bất cứ điều gì"

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

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

Hi thanx cho câu trả lời của bạn nhưng chúng ta có cần triển khai bất kỳ thứ gì không ?? Serializable hoặc Parcelable ?? –

+0

Tôi đang chuyển danh sách mảng của một đối tượng của một lớp .. –

+0

bạn có chắc chắn không? Bởi vì tôi phải triển khai Serializable/Parcelable khi tôi chuyển dữ liệu phức tạp giữa một đoạn và hoạt động bằng cách sử dụng mục đích ...... –

5

Chỉ cần kéo dài trước những câu trả lời thú vị - nó có thể giúp ai đó. Nếu lợi nhuận của bạn null, đặt nó để onCreate() phương pháp chứ không phải xây dựng các mảnh của bạn:

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

Để mở rộng câu trả lời trước nhiều hơn, như Ankit đã nói, các đối tượng phức tạp mà bạn cần phải thực hiện Serializable. Ví dụ, đối với các đố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); 
+0

trong mã của bạn 'TAG_TO_FRAGMENT' – kosala

+0

Bạn là người tốt nhất. Cảm ơn – kosala

+1

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

11

mã hoàn chỉnh của dữ liệu qua sử dụng đoạn để mảnh

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 đ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 
+0

nơi nhận được viewID? – Hoo

+0

@Hoo: vui lòng nêu rõ câu hỏi của bạn những gì bạn muốn hỏi –

+0

bạn có thể giúp tôi không? https://stackoverflow.com/questions/32983033/pass-data-to-another-fragment-by-swipe-view-with-tab-android-studio-not-button – Hoo

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

     } 
    }; 



} 

xem đoạn 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; 
    } 


} 
2
  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> 
+2

Giải thích câu trả lời của bạn? mã mà không có bất kỳ lời giải thích sẽ không giúp đỡ nhiều – Coder

+0

tôi đã viết mã trong một dòng chảy để nó có thể được hiểu ..... Truyền dữ liệu từ hoạt động chính để FragClass1 với việc sử dụng bó. –

Các vấn đề liên quan