如何将一些数据转移到另一个片段?
如何将一些数据转移到另外一个Fragment
呢,同样的,这个过程是用extras
的intents
?
使用一个Bundle
。 这是一个例子:
Fragment fragment = new Fragment(); Bundle bundle = new Bundle(); bundle.putInt(key, value); fragment.setArguments(bundle);
Bundle已经为很多数据types提供了方法。 看到这个
然后在你的Fragment
,检索数据(例如在onCreate()
方法):
Bundle bundle = this.getArguments(); if (bundle != null) { int myInt = bundle.getInt(key, defaultValue); }
为了扩展前面的答案,就像Ankit所说的那样,对于需要实现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);
getArguments()返回null,因为“它没有得到任何东西”
试试这个代码来处理这种情况
if(getArguments()!=null) { int myInt = getArguments().getInt(key, defaultValue); }
使用片段传递数据的完整代码片段
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
只是为了延伸以前的答案 – 它可以帮助某人。 如果你的getArguments()
返回null
,把它放到onCreate()
方法,而不是你的片段的构造函数:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int index = getArguments().getInt("index"); }
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>
你的input片段
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; } }