从ViewPager内的Fragment获取数据

6
我是一名有用的助手,可以翻译文本。
我有一个带有7个其他片段的视图页面片段。这些片段用于输入用户详细信息。在最后一个片段中,有一个“提交”按钮,我需要获取在其他片段中输入的所有用户详细信息。我该怎么做?
我看到了这个问题this,但没有帮助。因此,请不要将此问题标记为重复。 基础片段:
public class Register_Layout extends Fragment implements ViewPager.OnPageChangeListener{
public Register_Layout(){}

static ViewPager viewPager1;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_register_layout,  container, false);

    viewPager1 = (ViewPager) view.findViewById(R.id.view_pager1);
    viewPager1.setOffscreenPageLimit(7);
    FragmentManager fragmentManager =  getActivity().getSupportFragmentManager();
    viewPager1.setAdapter(new MyAdapter(fragmentManager));

    return view;
}

@Override
public void onPageScrolled(int position, float positionOffset, int    positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {

}

@Override
public void onPageScrollStateChanged(int state) {

}

}

class MyAdapter extends FragmentPagerAdapter{

public MyAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    Fragment fragment = null;
    if(position==0)
    {
        fragment = new Register();
    }

    if(position==1)
    {
        fragment = new Register_Page2();
    }

    if(position==2)
    {
        fragment = new Register_Page3();
    }

    if(position==3)
    {
        fragment = new Register_Page4();
    }

    if(position==4)
    {
        fragment = new Register_Page5();
    }

    if(position==5)
    {
        fragment = new Register_Page6();
    }

    if(position==6)
    {
        fragment = new Register_Page7();
    }
    return fragment;
}

@Override
public int getCount() {
    return 7;
}
}

最终的片段,我应该获取所有其他片段的数据:

public class Register_Page7 extends Fragment {
public Register_Page7(){

}

EditText editText;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_register_page7, container, false);

    Button Previous = (Button) view.findViewById(R.id.Previous7);
    Button Regiter = (Button) view.findViewById(R.id.Submit);
    Regiter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
            alertDialogBuilder.setMessage("Are you sure you want to submit?");

            alertDialogBuilder.setPositiveButton("Yes",new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface arg0, int arg1) {

                }
            });
            alertDialogBuilder.setNegativeButton("No,Let me check the details again", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                }
            });

            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
        }
    });

    Previous.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new Register_Layout().viewPager1.setCurrentItem(5);

        }
    });
    return view;
  }
 }

能看到代码就好了,也许可以看一下你最初是如何实例化这些片段的。 - Ryan Alford
稍等一下 @RyanAlford - Tony Mathew
你可以在Activity中创建一个临时数组或其他数据结构,并使用接口回调存储数据。 - Sarthak Mittal
@RyanAlford:我已经添加了代码。有什么帮助吗? - Tony Mathew
4个回答

1
您可能需要使用片段管理器来获取所有实例化的片段,并循环遍历它们以获取它们的相关数据。
您可以创建一个Fragment的子类,所有片段都可以从中继承。这个子类将有一个getText方法(或者其他类型的公共方法),用于从EditText视图中获取文本。
对于其他类型的数据(如开关),您需要类似的函数来从片段中获取数据。 编辑: 因此,您可以创建一个新的片段,该片段派生自Fragment
public class BaseEntryFragment extends Fragment {
    public BaseEntryFragment() {}

    public String getEntryText() {}
}

然后您可以获取现有片段并扩展您的新片段。
public class Register_Page7 extends BaseEntryFragment {

    private EditText _editText;

    public Register_Page7() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        //other create view code
        _editText = (EditText)FindViewById(R.id.edit_text);
    }

    @Override
    public String getEntryText() {
        return _editText.getText();
    }
}

然后,使用您的提交按钮...
List<Fragment> fragments = getActivity().getSupportFragmentManager().getFragments();
for(Fragment frag : fragments) {
    // do type checks here
    BaseEntryFragment f = (BaseEntryFragment)frag;
    String someValue = f.getEntryText();
}

请注意,我的Java非常生疏,因此可能不是完美的语法。这只是一些代码,让您开始并不打算复制和粘贴。

你能再解释详细一点吗?对不起,我是新手安卓开发者。我无法理解你所说的一切。请帮帮我。 - Tony Mathew

0

我认为在每个片段中,将用户数据存储在SharedPreference中会更容易(数据结构可以是JSON字符串或您喜欢的任何格式),在最后一个片段中读取共享偏好数据,并执行注册操作。

希望这有所帮助。


0

我建议您使用一个Activity来容纳您的ViewPager,并在那里声明您想要从Fragments保存的变量或对象。

在每个您想要保存数据的Fragment中,您必须使用interface将数据传递给Activity。以下是实现方法:在片段和其容器活动之间传递数据

然后,在您的最后一个Fragment中,您可以调用(使用我之前提到的生成的getter)您的容器Activity,如下所示:

YourActivity yourActivity = ((YourActivity) getActivity());
int foo = yourActivity.getFooInt();

0

您可以在Activity中查找Fragment并通过公共方法获取每个Fragment的数据。变量position表示Fragment在您的Viewpager中的位置。

public Fragment getFragment(ViewPager container, int position) {
String name = makeFragmentName(container.getId(), position);
return  mFragmentManager.findFragmentByTag(name);
}

private static String makeFragmentName(int viewId, int index) {
    return "android:switcher:" + viewId + ":" + index;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接