android - 如何使用 viewpager 和多个 fragment 创建多步骤注册表单?

标签 android android-layout android-fragments android-viewpager

我想在我的 android 应用程序中创建一个多步骤注册表单。我希望使用 viewpager有多个 fragments每个 fragment作为注册的一个步骤。

最后,我想使用一个 Activity 将每个 fragment 中提交的所有数据提交到 mysql数据库。我可以为此获得一个小示例代码吗?

这是我到目前为止所尝试的。我能够实现具有多个 fragment 的 viewpager。我在 StepOne.java fragment 中创建了一个接口(interface),以便与 Activity 进行通信。但我无法从这些 fragment 中检索数据。它在第 52 行抛出一个空指针异常。

这是我的代码:
SliderActivity.java:

public class SliderActivity extends AppCompatActivity  {
    ViewPager viewPager;
    EditText edName,edPassword, edConfPass;
    TextView tvShowAll;
    ViewPagerAdapter mPagerAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_slider);

        viewPager = findViewById(R.id.view_pager);
        mPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(mPagerAdapter);
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    public void selectIndex(int newIndex) {
        viewPager.setCurrentItem(newIndex);
    }

    @Override
    public void onBackPressed() {
        int currentPosition = viewPager.getCurrentItem();
        if (currentPosition != 0) {
            viewPager.setCurrentItem(viewPager.getCurrentItem()-1);
        } else {
            super.onBackPressed();
        }
    }

    public class ViewPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int position) {

            switch (position)
            {
                case 0:
                    return new StepOne(); 
                case 1:
                    return new StepTwo(); 
                case 2:
                    return new StepThree();
            }
            return null; 
        }

        @Override
        public int getCount() {
            return 3; //three fragments
        }
    }
}

StepOne.java:
public class StepOne extends Fragment {
    Button buttonInFragment1;
    EditText edName;

    public interface ActivityFragmentCallback {
        void onSetName(String name);
    }
    ActivityFragmentCallback listener;
    public StepOne() {

    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

        View rootView = inflater.inflate(R.layout.fragment_step_one, container, false);

        edName = rootView.findViewById(R.id.edName);


        buttonInFragment1 = rootView.findViewById(R.id.button_one);
        if(buttonInFragment1 != null) {
            buttonInFragment1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(getContext(),edName.getText().toString(),Toast.LENGTH_SHORT).show();
                    if(edName != null) {
                        listener.onSetName(edName.getText().toString());
                    }

                    switch (view.getId()){
                        case R.id.button_one:

                            ((SliderActivity)getActivity()).selectIndex(1);
                            break;
                    }
                }
            });
        }
        return rootView;
    }

    @Override
    public void onAttach(Context context){
        super.onAttach(context);
        try {
            listener = (ActivityFragmentCallback)context;
        }catch (ClassCastException c){
            c.printStackTrace();
        }
    }
}


MessageActivity.java:这里是我需要从所有 fragment 提交的所有数据的地方
public class MessageActivity extends AppCompatActivity implements StepOne.ActivityFragmentCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_message);
    }
    @Override
    public void onSetName(String name){
//        tvShowAll = findViewById(R.id.tvShowAll);
//        tvShowAll.setText(name);
        Toast.makeText(getApplicationContext(),name, Toast.LENGTH_LONG).show();
    }
}

最佳答案

关于android - 如何使用 viewpager 和多个 fragment 创建多步骤注册表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57139901/

相关文章:

android - 使用设计库需要使用 theme.appcompat

java - 在android中的gridview底部添加一个按钮

android - 在 Fragment 中加载 map

android - 增强(/操纵)一些流行的 Android 应用程序的文本(/视觉)输出! (例如 : whatsapp, gmail, facebook, ...)

java - 不能将整数转换为 float

android - 如何在 Android 模块之间共享依赖项

Android - 在 LinearLayout 或 RelativeLayout 中为 View 的 topMargin/bottomMargin/等设置动画

android - 仅显示一个 DialogFragment

java - 如何在点击后退按钮时从一个 fragment 调用另一个 fragment ?

android - 您如何防止 Android 调整操作栏 Logo 的大小?