从单个按钮从多个片段中提取数据

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 获取所有Fragments 并从中调用getter 方法。您可以在instantiateItem 方法中保存对Fragments 的引用,并在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

以上是关于从单个按钮从多个片段中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中使用具有多个布局的单个片段

在单个片段事务中添加多个返回堆栈条目

如何在按下单个片段的手动后退按钮时返回上一个片段?

vue.js 2 - 将单个文件组件的 html 片段提取到独立文件中

在一个活动中加载单个片段两次,从本地json文件中加载2个问题

工具栏 - 只有一个活动从抽屉切换到后退按钮