我有一个包含3步注册活动的应用程序。这3个步骤分为3个片段,veiwpager可以向后和向前滑动,最后一步有一个注册按钮,当按下时,数据将被发送到数据库,该数据库将在Register
活动中完成。
我将用户在3个片段中输入的所有数据传递给Register
活动时遇到问题。
我正在考虑在刷到下一个片段时保存每个片段的数据,但我感到困惑!
注册活动:
public class Register extends FragmentActivity {
ViewPager pager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
pager = (ViewPager) findViewById(R.id.viewPager);
pager.setAdapter(new PageAdapter(getSupportFragmentManager()));
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener(){
// This method will be invoked when a new page becomes selected.
@Override
public void onPageSelected(int position) {
}
// This method will be invoked when the current page is scrolled
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
// Called when the scroll state changes:
// SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING
@Override
public void onPageScrollStateChanged(int state) {
// Code goes here
}
});
}
private static String makeFragmentName(int viewPagerId, int index) {
return "android:switcher:" + viewPagerId + ":" + index;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_register, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
注册XML:
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<android.support.v4.view.PagerTabStrip
android:id="@+id/pager_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:paddingBottom="4dp"
android:paddingTop="4dp" />
</android.support.v4.view.ViewPager>
First Fragment:
public class personal_info_fragment extends Fragment {
private EditText fname,lname,pass,conf_pass,phone_nb,license_nb;
private Spinner age_spinner;
private RadioButton male_rb,female_rb;
private String first_name,last_name,license,phone,password,conf_password;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.personal_info_fragment, container, false);
fname = (EditText) v.findViewById(R.id.fname);
lname = (EditText) v.findViewById(R.id.lname);
license_nb = (EditText) v.findViewById(R.id.license_nb);
pass = (EditText) v.findViewById(R.id.pass);
conf_pass = (EditText) v.findViewById(R.id.conf_pass);
phone_nb = (EditText) v.findViewById(R.id.phone_nb);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
public static personal_info_fragment newInstance(String text) {
personal_info_fragment f = new personal_info_fragment();
Bundle b = new Bundle();
b.putString("msg", text);
f.setArguments(b);
return f;
}
}
First Fragment XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/personal_info"
android:id="@+id/textView3"
android:gravity="center" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fname"
android:hint="@string/fname"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lname"
android:layout_gravity="center_horizontal"
android:hint="@string/lname"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/license_nb"
android:layout_gravity="center_horizontal"
android:hint="@string/license_nb"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:id="@+id/pass"
android:layout_gravity="center_horizontal"
android:hint="@string/pass"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:id="@+id/conf_pass"
android:layout_gravity="center_horizontal"
android:hint="@string/conf_pass"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="phone"
android:ems="10"
android:id="@+id/phone_nb"
android:layout_gravity="center_horizontal"
android:hint="@string/phone"/>
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:orientation="horizontal">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/male"
android:id="@+id/male_rb" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/female"
android:id="@+id/female_rb" />
</RadioGroup>
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/age_spinner" />
</LinearLayout>
第二个和第三个片段与第一个片段类似。
页面适配器:
public class PageAdapter extends FragmentPagerAdapter {
public PageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int pos) {
switch(pos) {
case 0:
return new personal_info_fragment();
case 1:
return new medical_info_fragment();
case 2:
return new car_info_fragment();
default:
return null;
}
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch(position) {
case 0:
return "Personal Information";
case 1:
return "Medical Information";
case 2:
return "Car Information";
default:
return null;
}
}
}
提前感谢。
答案 0 :(得分:2)
您需要创建一个界面。像这样:
public interface ConnectActivityAndFragments {
void sendData(Bundle data);
}
您的活动应实现此界面并覆盖此方法:
@Override
public void sendData(Bundle data) {
Fragment oneFr = new Fragment();
oneFr.setArguments(data);
fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frag_container, oneFr);
fragmentTransaction.commit();
}
现在在您的片段中,您需要获取界面的实例,将片段附加到您的活动中,然后您就可以使用该方法。这样的事情:
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
yourActivityControl = (ConnectActivityAndFragments) getActivity();
} catch (ClassCastException ex) {
throw ex;
}
}
void getData(){
yourActivityControl.sendData(Your Bundle with Data);
}
答案 1 :(得分:0)
考虑这个想法:
注册过程中的ViewPager
概念可能不是最佳解决方案。查看寻呼机用于使导航更容易和更快,但现在当您必须传递大量数据/输入时,挑战就出现了。
可能的方法是创建3 Activitities
。例如:
PersonalInformationActivity extends AppCompatActivity{}
MedicalInformationActivity extends AppCompatActivity{}
CarInformationActivity extends AppCompatActivity{}
不是让3 Fragments
加MainActivity
使你的总课程4,你最终只会使用这种方法3个课程,然后你可以简单地将额外的东西从第一个活动传递给第二个在第三项活动中,您可以简单地进行注册或任何您想做的事情。
总而言之,
在第一个活动中,有一个NEXT按钮,当点击它时获得在第一个活动中输入的输入并转换到第二个活动(也许在这里使用平滑过渡以避免用户眼中的重大变化像幻灯片一样)。
在第二个活动中,使用意图提取,来自活动一的信息,并在用户在那里输入数据时存储在局部变量中。完成后,使用活动1中的按钮,单击时,将活动1和第二个活动中的两个值传递给上一个活动。
最后,从活动3中的活动1和2中提取值,一旦用户将数据输入活动3中的表单,您就可以轻松发送或存储它们了!
我希望这个细分可以帮助你理解。