每个fragment实例都可附带一个Bundle对象。该bundle包含有键值对,我们可以像附加extra 到Activity的intent中那样使用它们。一个键值对即一个argument。
要创建fragment argument,首先需创建Bundle对象。然后使用Bundle限定类型的“put”方法,将argument添加到bundle中。那么具体如何操作呢?下面南昌APP开发公司小编就来为大家介绍一下,代码如下:
Bundle args = new Bundle();
args.putSerializable(EXTRA_MY_OBJECT, myObject);
args.putInt(EXTRA_MY_INT, myInt);
args.putCharSequence(EXTRA_MY_STRING, myString);
要附加argument bundle给fragment,需调用Fragment.setArguments(Bundle)方法。而且,还必须在fragment创建后、添加给activity前完成。
为满足以上要求,Android开发者采取的习惯做法是:添加名为newInstance()的静态方法给Fragment类。使用该方法,完成fragment实例及bundle对象的创建,然后将argument放入bundle 中,后再附加给fragment。
托管activity需要fragment实例时,转而调用newInstance()方法,而非直接调用其构造方法。而且,为满足fragment创建argument的要求,activity可传入任何需要的参数给newInstance()方法。
在CrimeFragment类中,编写可以接受UUID参数的newInstance(UUID)方法,如下代码所示。通过该方法,创建argument bundle和fragment实例,然后附加argument给fragment。
编写newInstance(UUID)方法(CrimeFragment.java)
public class CrimeFragment extends Fragment {
private static final String ARG_CRIME_ID = "crime_id";
private Crime mCrime;
private EditText mTitleField;
private Button mDateButton;
private CheckBox mSolvedCheckbox;
public static CrimeFragment newInstance(UUID crimeId) {
Bundle args = new Bundle();
args.putSerializable(ARG_CRIME_ID, crimeId);
CrimeFragment fragment = new CrimeFragment();
fragment.setArguments(args);
r
eturn fragment;
}
...
}
现在,需创建CrimeFragment时,CrimeActivity应调用CrimeFragment.newInstance(UUID) 方法,并传入从它的extra中获取的UUID参数值。回到CrimeActivity类中,在createFragment() 方法里,从CrimeActivity的intent中获取extra数据,并传入CrimeFragment.newInstance(UUID) 方法,如代码清单1所示。
既然其他类不会用到EXTRA_CRIME_ID,可以将其改为私有。(注意,为了方便,我们直接删除并替换了第一行,实际上只要改public为private就可以了。)
代码清单1 使用newInstance(UUID)方法 (CrimeActivity.java)
public class CrimeActivity extends SingleFragmentActivity {
public static final String EXTRA_CRIME_ID = "com.bignerdranch.android.criminalintent.crime_id";
private static final String EXTRA_CRIME_ID = "com.bignerdranch.android.criminalintent.crime_id";
...
@Override
protected Fragment createFragment() {
return new CrimeFragment();
UUID crimeId = (UUID) getIntent()
.getSerializableExtra(EXTRA_CRIME_ID);
return CrimeFragment.newInstance(crimeId);
}
}
注意,activity和fragment不需要也无法同时相互保持独立性。CrimeActivity必须了解 CrimeFragment的内部细节,比如知道它内部有个newInstance(UUID)方法。这很正常。托管 activity应该知道这些细节,以便托管fragment;但fragment就不一定要知道其托管activity的细节问题,至少在需要保持fragment通用独立性的时候是如此。
以上便是南昌APP开发公司-易速网络为大家介绍的把argument附加给 fragment 的方法,希望对大家有所帮助。了解更多关于APP开发方面的知识,欢迎访问公司官网!
易速网站优化公司 » APP开发之附加argument给 fragment 的方法