【问题标题】:Get data from fragments inside viewpager从 viewpager 中的 Fragment 获取数据
【发布时间】:2016-09-28 00:19:57
【问题描述】:

我有一个带有 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;
  }
 }

【问题讨论】:

  • 很高兴看到代码。也许你最初是如何实例化片段的。
  • 等一下@RyanAlford
  • 您可以在Activity中创建一个临时数组或其他数据结构,并使用接口回调存储数据
  • @RyanAlford:我已经添加了代码。有什么帮助吗?

标签: android android-fragments android-viewpager


【解决方案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 真的很生锈,所以它可能不是完美的语法。这只是一些帮助您入门的代码,并非旨在复制和粘贴。

【讨论】:

  • 你能再解释一下吗?对不起,我是安卓新手。我无法理解你所说的一切。请帮忙
【解决方案2】:

我认为在每个片段中更容易,您将用户数据存储在 SharedPreference 上(数据结构可以是 json 字符串或您喜欢的任何内容),最后(最后一个片段)读取共享首选项数据,并执行登记册

希望对你有帮助

【讨论】:

    【解决方案3】:

    我建议您使用Activity 来保存您的ViewPager 并在其中声明要从Fragments 保存的变量或对象。

    在每个Fragment 中,您要保存数据,您必须使用interface 将数据传递给Activity。方法如下:Passing data between a fragment and its container activity

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

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

    【讨论】:

      【解决方案4】:

      您可以在 Activity 中找到 Fragment,并通过 public 方法从每个 Fragment 中获取数据。变量position 是片段在您的浏览器中的位置

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 2013-09-07
        • 1970-01-01
        • 2018-02-13
        • 2018-10-02
        相关资源
        最近更新 更多