捆绑 getArguments returns 空
Bundle getArguments returns null
首先,其他问题对我没有帮助,我也无法解决我的问题。
好的,现在我有 2 个片段,我必须从一个片段中获取已检查的元素,将它们添加到捆绑包中并进入其他片段。我正在调试,我在 setArguments()
中看到他保存了选中的元素,但是当我想在其他片段中获取参数时,它 returns 为空。怎么了?
public class FragmentLanguage extends Fragment {
public static final String TEXT = "language";
PersonalInfoFragment info = new PersonalInfoFragment();
View mainView;
ListView listView;
Button clear, next;
MyAdapter adapter = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mainView = inflater.inflate(R.layout.listview, container, false);
listView = mainView.findViewById(R.id.list_view);
select_Lang();
checkButtonClick();
return mainView;
}
private void select_Lang() {
ArrayList<Item_obj> itemList = new ArrayList<>();
Item_obj item_obj = new Item_obj("Armenian", R.drawable.download, false);
itemList.add(item_obj);
item_obj = new Item_obj("Russian", R.drawable.download, false);
itemList.add(item_obj);
//create an ArrayAdapter from the String Array
adapter = new MyAdapter(getActivity(), R.layout.listview_items, itemList);
// Assign adapter to ListView
listView.setAdapter(adapter);
}
private void checkButtonClick() {
next = mainView.findViewById(R.id.next);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<Item_obj> arrayList = adapter.items_list;
for (int i = 0; i < arrayList.size(); i++) {
Item_obj item = arrayList.get(i);
if (item.isSelected()) {
Bundle bundle = new Bundle();
bundle.putString(TEXT, item.getLanguage());
info.setArguments(bundle);
getFragmentManager().beginTransaction().replace(R.id.container,
new PersonalInfoFragment()).addToBackStack(null).commit();
}
}
}
});
}}
好的,这是我想要获取已保存参数的片段。
public class PersonalInfoFragment extends Fragment {
public static final String TEXT = "language";
View mainView;
EditText skills_description;
Button save, languages;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mainView = inflater.inflate(R.layout.personal_info, container, false);
init(mainView);
return mainView;
}
private void init(View v) {
skills_description = v.findViewById(R.id.skills);
languages = v.findViewById(R.id.select_language);
save = v.findViewById(R.id.save);
languages.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().beginTransaction().replace(R.id.container,
new FragmentLanguage()).addToBackStack(null).commit();
}
});
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = getArguments();
if (bundle != null) {
Toast.makeText(getActivity(), bundle.getString(TEXT), Toast.LENGTH_SHORT).show();
}
}
});
}}
但他returns无效。如何解决?谢谢。
这是我的适配器 class。
public class MyAdapter extends BaseAdapter {
Context ct;
LayoutInflater lInflater;
ArrayList<Item_obj> objects;
PersonalInfoFragment info = new PersonalInfoFragment();
MyAdapter(Context context, ArrayList<Item_obj> itemObj) {
ct = context;
objects = itemObj;
lInflater = (LayoutInflater) ct
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return objects.size();
}
@Override
public Object getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.listview_items, parent, false);
}
Item_obj io = getItem_obj(position);
((TextView) view.findViewById(R.id.select_lang)).setText(io.language);
((ImageView) view.findViewById(R.id.imageView)).setImageResource(io.image);
CheckBox cb = view.findViewById(R.id.checkbox);
cb.setOnCheckedChangeListener(myCheckChangeList);
cb.setTag(position);
cb.setChecked(io.isSelected);
return view;
}
Item_obj getItem_obj(int position) {
return (Item_obj) getItem(position);
}
ArrayList<Item_obj> getCheck() {
ArrayList<Item_obj> item = new ArrayList<>();
for (Item_obj i : objects) {
if (i.isSelected)
item.add(i);
}
return item;
}
OnCheckedChangeListener myCheckChangeList = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
getItem_obj((Integer) buttonView.getTag()).isSelected = isChecked;
}
};
}
您的 info
成员与 new PersonalInfoFragment()
不同。在前者上你设置了 Bundle
而在后者你没有。不幸的是,您正在使用后者来提交交易
您正在全球化 PersonalInfoFragment 并将 bundle 设置为它的引用,并且您正在发送一个没有任何 bundle 的新对象
getFragmentManager().beginTransaction().replace(R.id.container,
new PersonalInfoFragment()).addToBackStack(null).commit();
替换new PersonalInfoFragment() with info
在 replace() 方法中传递信息,您的问题将得到解决-
但是你应该在 for 循环之外提交你的片段
int itemCount = 0;
Bundle bundle = new Bundle();
for (int i = 0; i < arrayList.size(); i++) {
Item_obj item = arrayList.get(i);
if (item.isSelected()) {
itemCount++;
bundle.putString(TEXT+"i"+, item.getLanguage());
}
}
bundle.putInt("itemCount",itemCount);
info.setArguments(bundle);
getFragmentManager().beginTransaction().replace(R.id.container,
info).addToBackStack(null).commit();
现在您可以获取其他片段的所有值,如 -
Bundle bundle = getArguments();
int itemCount = bundle.getInt("itemCount",0);
if(itemCount > 0){
for (int i = 0; i < itemCount ; i++) {
String language = bundle.getString(TEXT+"i");
}
}
首先,其他问题对我没有帮助,我也无法解决我的问题。
好的,现在我有 2 个片段,我必须从一个片段中获取已检查的元素,将它们添加到捆绑包中并进入其他片段。我正在调试,我在 setArguments()
中看到他保存了选中的元素,但是当我想在其他片段中获取参数时,它 returns 为空。怎么了?
public class FragmentLanguage extends Fragment {
public static final String TEXT = "language";
PersonalInfoFragment info = new PersonalInfoFragment();
View mainView;
ListView listView;
Button clear, next;
MyAdapter adapter = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mainView = inflater.inflate(R.layout.listview, container, false);
listView = mainView.findViewById(R.id.list_view);
select_Lang();
checkButtonClick();
return mainView;
}
private void select_Lang() {
ArrayList<Item_obj> itemList = new ArrayList<>();
Item_obj item_obj = new Item_obj("Armenian", R.drawable.download, false);
itemList.add(item_obj);
item_obj = new Item_obj("Russian", R.drawable.download, false);
itemList.add(item_obj);
//create an ArrayAdapter from the String Array
adapter = new MyAdapter(getActivity(), R.layout.listview_items, itemList);
// Assign adapter to ListView
listView.setAdapter(adapter);
}
private void checkButtonClick() {
next = mainView.findViewById(R.id.next);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<Item_obj> arrayList = adapter.items_list;
for (int i = 0; i < arrayList.size(); i++) {
Item_obj item = arrayList.get(i);
if (item.isSelected()) {
Bundle bundle = new Bundle();
bundle.putString(TEXT, item.getLanguage());
info.setArguments(bundle);
getFragmentManager().beginTransaction().replace(R.id.container,
new PersonalInfoFragment()).addToBackStack(null).commit();
}
}
}
});
}}
好的,这是我想要获取已保存参数的片段。
public class PersonalInfoFragment extends Fragment {
public static final String TEXT = "language";
View mainView;
EditText skills_description;
Button save, languages;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mainView = inflater.inflate(R.layout.personal_info, container, false);
init(mainView);
return mainView;
}
private void init(View v) {
skills_description = v.findViewById(R.id.skills);
languages = v.findViewById(R.id.select_language);
save = v.findViewById(R.id.save);
languages.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().beginTransaction().replace(R.id.container,
new FragmentLanguage()).addToBackStack(null).commit();
}
});
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = getArguments();
if (bundle != null) {
Toast.makeText(getActivity(), bundle.getString(TEXT), Toast.LENGTH_SHORT).show();
}
}
});
}}
但他returns无效。如何解决?谢谢。
这是我的适配器 class。
public class MyAdapter extends BaseAdapter {
Context ct;
LayoutInflater lInflater;
ArrayList<Item_obj> objects;
PersonalInfoFragment info = new PersonalInfoFragment();
MyAdapter(Context context, ArrayList<Item_obj> itemObj) {
ct = context;
objects = itemObj;
lInflater = (LayoutInflater) ct
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return objects.size();
}
@Override
public Object getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.listview_items, parent, false);
}
Item_obj io = getItem_obj(position);
((TextView) view.findViewById(R.id.select_lang)).setText(io.language);
((ImageView) view.findViewById(R.id.imageView)).setImageResource(io.image);
CheckBox cb = view.findViewById(R.id.checkbox);
cb.setOnCheckedChangeListener(myCheckChangeList);
cb.setTag(position);
cb.setChecked(io.isSelected);
return view;
}
Item_obj getItem_obj(int position) {
return (Item_obj) getItem(position);
}
ArrayList<Item_obj> getCheck() {
ArrayList<Item_obj> item = new ArrayList<>();
for (Item_obj i : objects) {
if (i.isSelected)
item.add(i);
}
return item;
}
OnCheckedChangeListener myCheckChangeList = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
getItem_obj((Integer) buttonView.getTag()).isSelected = isChecked;
}
};
}
您的 info
成员与 new PersonalInfoFragment()
不同。在前者上你设置了 Bundle
而在后者你没有。不幸的是,您正在使用后者来提交交易
您正在全球化 PersonalInfoFragment 并将 bundle 设置为它的引用,并且您正在发送一个没有任何 bundle 的新对象
getFragmentManager().beginTransaction().replace(R.id.container,
new PersonalInfoFragment()).addToBackStack(null).commit();
替换new PersonalInfoFragment() with info
在 replace() 方法中传递信息,您的问题将得到解决-
但是你应该在 for 循环之外提交你的片段
int itemCount = 0;
Bundle bundle = new Bundle();
for (int i = 0; i < arrayList.size(); i++) {
Item_obj item = arrayList.get(i);
if (item.isSelected()) {
itemCount++;
bundle.putString(TEXT+"i"+, item.getLanguage());
}
}
bundle.putInt("itemCount",itemCount);
info.setArguments(bundle);
getFragmentManager().beginTransaction().replace(R.id.container,
info).addToBackStack(null).commit();
现在您可以获取其他片段的所有值,如 -
Bundle bundle = getArguments();
int itemCount = bundle.getInt("itemCount",0);
if(itemCount > 0){
for (int i = 0; i < itemCount ; i++) {
String language = bundle.getString(TEXT+"i");
}
}