由于无法重写构造函数,如何在实例化 Fragment 时传递数据?
How to pass data when instantiating a Fragment since I can't override the constructor?
我有一个 FragmentPagerAdapter,我希望它加载具有不同值的同一个片段,而不是多个片段。
这个值只是 1 个字符串。如何通过?
有关如何操作的简单示例:
// in the adapter
private static final String[] VALUES = {
"string 1",
"string 2",
"string 3",
"string 4",
"string 5", };
@Override
public Fragment getItem(int position) {
MyFrag f = new MyFrag();
Bundle b = new Bundle();
b.putString("value", VALUES[position]);
f.setArguments(b);
return f;
}
// then in the fragment
private String value;
public void onCreate(Bundle savedInstanceState) {
value = getArguments.getString("value");
}
您应该使用 Bundle
(片段参数)。参见示例:
//put yours info to Bundle
Bundle bundl = new Bundle();
bundl.putString("key", "value");
//set bundle to frgments arguments
YoursFragClass frag = new YoursFragClass();
frag.setArguments(bundl);
//add fragment to activity
...
您在 Bundle
中的信息将作为 Fragments
生命周期方法的参数出现
//then in fragments `onCreate()` or `onCreateView()` you receive this Bundle as argument
public class YoursFragClass extends Fragment {
public View onCreateView(LayoutInflater inflater,
ViewGroup containerObject,
Bundle savedInstanceState){
//here is your arguments
Bundle bundle=getArguments();
//here is yours info
String myString = bundle.getString("key");
System.out.println(myString); //will show "value" in logCat
}
}
你应该为此使用参数。
它们表示为 Bundle
并通过 setArguments()
设置。请记住,它们只能在片段附加到 activity.
之前设置
为方便起见,您可以为您的片段创建一个工厂方法以隐藏创建包的复杂性:
public class MyFragment extends Fragment {
public static MyFragment getInstance(<the instantiation parameters here>) {
// check parameter preconditions
final Bundle arguments = new Bundle();
// put parameters into the bundle
final MyFragment instance = new MyFragment();
instance.setArguments(arguments);
return instance;
}
}
使用参数的另一个好处是,如果正在重新创建片段实例,它们将被保留。
我有一个 FragmentPagerAdapter,我希望它加载具有不同值的同一个片段,而不是多个片段。 这个值只是 1 个字符串。如何通过?
有关如何操作的简单示例:
// in the adapter
private static final String[] VALUES = {
"string 1",
"string 2",
"string 3",
"string 4",
"string 5", };
@Override
public Fragment getItem(int position) {
MyFrag f = new MyFrag();
Bundle b = new Bundle();
b.putString("value", VALUES[position]);
f.setArguments(b);
return f;
}
// then in the fragment
private String value;
public void onCreate(Bundle savedInstanceState) {
value = getArguments.getString("value");
}
您应该使用 Bundle
(片段参数)。参见示例:
//put yours info to Bundle
Bundle bundl = new Bundle();
bundl.putString("key", "value");
//set bundle to frgments arguments
YoursFragClass frag = new YoursFragClass();
frag.setArguments(bundl);
//add fragment to activity
...
您在 Bundle
中的信息将作为 Fragments
生命周期方法的参数出现
//then in fragments `onCreate()` or `onCreateView()` you receive this Bundle as argument
public class YoursFragClass extends Fragment {
public View onCreateView(LayoutInflater inflater,
ViewGroup containerObject,
Bundle savedInstanceState){
//here is your arguments
Bundle bundle=getArguments();
//here is yours info
String myString = bundle.getString("key");
System.out.println(myString); //will show "value" in logCat
}
}
你应该为此使用参数。
它们表示为 Bundle
并通过 setArguments()
设置。请记住,它们只能在片段附加到 activity.
为方便起见,您可以为您的片段创建一个工厂方法以隐藏创建包的复杂性:
public class MyFragment extends Fragment {
public static MyFragment getInstance(<the instantiation parameters here>) {
// check parameter preconditions
final Bundle arguments = new Bundle();
// put parameters into the bundle
final MyFragment instance = new MyFragment();
instance.setArguments(arguments);
return instance;
}
}
使用参数的另一个好处是,如果正在重新创建片段实例,它们将被保留。