从单个按钮从多个片段中提取数据
Posted
技术标签:
【中文标题】从单个按钮从多个片段中提取数据【英文标题】:Extract data from multiple fragments from single button 【发布时间】:2016-10-24 06:16:19 【问题描述】:我正在制作一个联系人应用程序。它具有三个片段,滚动视图,具有编辑文本。此外,该活动在菜单项中有一个保存按钮。我想通过一个保存按钮来保存所有三个片段的数据。我的用户界面看起来像这样
如何将所有三个片段中的数据提取到我的容器活动中。
这是我在容器活动中保存菜单项的代码
@Override
public boolean onOptionsItemSelected(MenuItem item)
switch (item.getItemId())
case R.id.discard :
break;
case R.id.save:
Personal_Details p1 = new Personal_Details();
Proffesional_Details p2 = new Proffesional_Details();
Social s = new Social();
Person p = new Person(p1.getName(),p1.getLastName(),p1.getPhone(),p1.getEmail(),p1.getDOB(),
p2.getCName(),p2.getTitle(),p2.getIM(),p2.getwebsite(),p2.getOfficeA(),
s.getNickName(),s.getIntro(),s.getFb(),s.getTwitter(),s.getInsta());
dbHelper Database = new dbHelper(this,null,null,1);
Database.addPerson(p);
break;
return true;
这是我在三个相同片段 PERSONAL_DETAILS 之一中的代码:
public class Personal_Details extends Fragment
EditText name, lastname, phoneNumber,email,dob;
public Personal_Details()
// Required empty public constructor
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_personal__details, container, false);
@Override
public void onActivityCreated(Bundle savedInstanceState)
super.onActivityCreated(savedInstanceState);
initialize();
private void initialize()
name= (EditText)getActivity().findViewById(R.id.name);
lastname= (EditText)getActivity().findViewById(R.id.lastName);
phoneNumber= (EditText)getActivity().findViewById(R.id.phoneNumber);
email= (EditText)getActivity().findViewById(R.id.emailAddress);
dob= (EditText)getActivity().findViewById(R.id.DOB);
public String getName()
if(name.getText().toString()!=null)
return name.getText().toString();
else
return "";
public String getLastName()
if(lastname.getText().toString()!=null)
return lastname.getText().toString();
else
return "";
public String getEmail()
if(email.getText().toString()!=null)
return email.getText().toString();
else
return "";
public String getPhone()
if(phoneNumber.getText().toString()!=null)
return phoneNumber.getText().toString();
else
return "";
public String getDOB()
if(dob.getText().toString()!=null)
return dob.getText().toString();
else
return "";
如何通过保存按钮将这些片段中的信息保存到我的容器活动中?
编辑:这是我的滚动视图适配器
`class MyAdapter 扩展 FragmentStatePagerAdapter
public MyAdapter(FragmentManager fm)
super(fm);
@Override
public Fragment getItem(int position)
Fragment fragment = null;
switch (position)
case 0:
fragment = new Personal_Details();
break;
case 1:
fragment = new Proffesional_Details();
break;
case 2 :
fragment = new Social();
break;
default:break;
return fragment;
@Override
public int getCount()
return 3;
@Override
public CharSequence getPageTitle(int position)
switch (position)
case 0 : return "Personal";
case 1 : return "Professional";
case 2 : return "Social";
default:return null ;
`
【问题讨论】:
嗯,你可以通过FragmentManager
找到片段并调用必要的方法。还是我错过了什么?
从 FragmentManager 调用需要 ID。从 ViewPager 和 FragmentStatePageAdapter 制作滚动视图时,它不需要 id。 @PetrovDmitrii
那我怎样才能给片段ID!我编辑了问题并将容器活动放在那里@PetrovDmitrii
【参考方案1】:
您可以从FragmentStatePagerAdapter
获取所有Fragment
s 并从中调用getter 方法。您可以在instantiateItem
方法中保存对Fragment
s 的引用,并在destroyItem
方法中删除它们。
示例代码 -
public class MyPagerAdapter extends FragmentStatePagerAdapter
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public MyPagerAdapter(FragmentManager fm)
super(fm);
@Override
public int getCount()
return ...;
@Override
public Fragment getItem(int position)
return MyFragment.newInstance(...);
@Override
public Object instantiateItem(ViewGroup container, int position)
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
@Override
public void destroyItem(ViewGroup container, int position, Object object)
registeredFragments.remove(position);
super.destroyItem(container, position, object);
public List<Fragment> getAllFragments()
List<Fragment> list = new List<Fragment>();
for(int i = 0; i < sparseArray.size(); i++)
int key = sparseArray.keyAt(i);
// get the object by the key.
list.add(sparseArray.get(key));
return list;
【讨论】:
你能告诉我怎么做吗? 哦,谢谢!以及如何从这个列表中引用片段类!! 希望你明白了吗?您可以使用instanceof
。以上是关于从单个按钮从多个片段中提取数据的主要内容,如果未能解决你的问题,请参考以下文章
vue.js 2 - 将单个文件组件的 html 片段提取到独立文件中