gpt4 book ai didi

android - 从 ViewPager 中的 fragment 读取值

转载 作者:行者123 更新时间:2023-11-30 02:47:27 24 4
gpt4 key购买 nike

我的 viewpager 中有三个页面,每个页面都是一个 fragment,每个页面中都有一些 EditText,我第三页我有一个名为 SAVEButton,现在在这个按钮单击事件中我必须使用所有 EditText 的值。我尝试了很多方法,但都没有用,我总是得到 NullPinterException。任何帮助将不胜感激。

谢谢,古纳。

最佳答案

我当前的应用程序中有一个非常相似的设置。我所做的是创建具有以下方法的 Fragment 的子类:

public abstract String[] getForm();

getForm 方法本质上返回一个 String[],其中包含存储在每个表单中的字符串。每个 Fragment 都必须正确地实现它。现在一旦你有了它,在包含 ViewPager 的 Activity 中初始化一个 fragment 列表,你的 Activity 的 ViewPagerAdapter 应该使用这些 fragment 来显示。这样,现在当您在最后一个 fragment 中并单击此按钮时(并且包含按钮点击的 fragment 成功通知 Activity 按钮点击事件发生了),您的 Activity 将知道遍历整个 fragment 列表,调用 fragment 各自的 getForm 方法实现。

请注意,这仅在您不使用 ViewStatePagerAdapter 时才有效。这样做的原因是因为不能保证 ViewStatePagerAdapter 将所有 fragment 保存在内存中。

这是一个代码示例(在代码示例中,我将 View 寻呼机存储在一个 fragment 中,但如果您将 View 寻呼机保持在一个 Activity 中,这种设计肯定会起作用)。真正的工作是在提交方法中完成的。那是我们从另一个 fragment 收集字段的地方(因此应该在您的 OnButtonClickListener 代码中调用此方法):

public class CreateAccountFragment extends RestCallExecutingFragment implements ViewPager.OnPageChangeListener {
private OnAccountCreationListener onAccountCreationListener;
public static final int VARIOUS_FRAG_POS = 2;
public static final int ACCOUNT_INFO_FRAG_POS = 0;
private static final int ADDRESS_FRAG_POS = 1;
public static final int CREATE_ACCOUNT_ID = 0;

public CreateAccountFragment() {
// Required empty public constructor
}

ArrayList<FormFragment> fragmentsToDisplay;

/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link android.support.v13.app.FragmentPagerAdapter} derivative, which will keep every
* loaded fragment in memory. If this becomes too memory intensive, it
* may be best to switch to a
* {@link android.support.v13.app.FragmentStatePagerAdapter}.
*/
SectionsPagerAdapter mSectionsPagerAdapter;

/**
* The {@link android.support.v4.view.ViewPager} that will host the section contents.
*/
ViewPager mViewPager;

@InjectView(R.id.rb_accountInfo)
RadioButton rb_accountInfo;

@InjectView(R.id.rb_address)
RadioButton rb_address;

@InjectView(R.id.rb_various)
RadioButton rb_various;

@InjectView(R.id.rg_createAccount)
RadioGroup rg_createAccount;

@InjectView(R.id.tv_pageTitle)
TextView tv_pageTitle;

List<RadioButton> radioButtons;

CreateAccountCommand createAccountCommand;

private static ArrayList<FormFragment> getCreateAccountFragments(){
ArrayList<FormFragment> list = new ArrayList<>();
list.add(AccountInfoFragment.newInstance());
list.add(AddressFragment.newInstance());
list.add(VariousFragment.newInstance());
return list;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.frag_create_account, container, false);
ButterKnife.inject(this, view);
fragmentsToDisplay = getCreateAccountFragments();
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
//todo make it easier to press the radio button
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) view.findViewById(R.id.pager);
mViewPager.setOnPageChangeListener(this);
mViewPager.setAdapter(mSectionsPagerAdapter);
return view;
}

public void submit() {
//todo move the create account button to this activity's view
AccountSubmissionRDTO createAccountSubmissionDTO;
try {
AccountInfoData accountInfoData = (AccountInfoData) fragmentsToDisplay.get(ACCOUNT_INFO_FRAG_POS).submitForm();
AddressData addressData = (AddressData) fragmentsToDisplay.get(ADDRESS_FRAG_POS).submitForm();
VariousData variousData = (VariousData) fragmentsToDisplay.get(VARIOUS_FRAG_POS).submitForm();
// createAccountSubmissionDTO = new CreateAccountSubmissionRDTO(CREATE_ACCOUNT_ID,0, -1, accountInfoData,addressData,variousData); //todo create actual server and local ids

}

/**
* A {@link android.support.v13.app.FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

@Override
public Fragment getItem(int position) {
FormFragment selectedFragment = fragmentsToDisplay.get(position);

Assert.assertNotNull("the fragment selected should be within list", selectedFragment);
return selectedFragment;
}

@Override
public int getCount() {
return fragmentsToDisplay.size();
}

@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
String pageTitle = fragmentsToDisplay.get(position).getPageTitle();
return pageTitle.toUpperCase(l);
}
}
}

关于android - 从 ViewPager 中的 fragment 读取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24794023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com