如何在android中使用viewpager时在片段之间传递值

时间:2014-09-23 09:42:29

标签: java android android-fragments

我正在创建一个已经分成三个片段的注册表单。这三个片段通过viewpager连接。我可以使用下一个和前一个按钮遍历片段。我想要第一个和第二个片段的数据到在第三个片段中可用。一个选项是使用sharedpreferences.Is还有其他方法。

主要班级:

package pl.looksok.viewpagerdemo;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class MainActivity extends FragmentActivity {
    ViewPager pager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyPagerAdapter pageAdapter = new MyPagerAdapter(getSupportFragmentManager());
         pager = (ViewPager)findViewById(R.id.myViewPager);
        pager.setAdapter(pageAdapter);



    }
    public void selectFragment(int position){
    pager.setCurrentItem(position, true); 
    // true is to animate the transaction
    }
}

主要的xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <pl.looksok.viewpagerdemo.CustomViewPager
        android:id="@+id/myViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

第一个片段:

package pl.looksok.viewpagerdemo;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public class FragmentBlue extends Fragment {
Button btnnext1;
RelativeLayout frag1;

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

        View view = inflater.inflate(R.layout.fragment_blue, container, false);
        btnnext1=(Button) view.findViewById(R.id.btnnext1);
        frag1=(RelativeLayout) view.findViewById(R.id.frag1);

        btnnext1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {


                ((MainActivity)getActivity()).selectFragment(1);
            }
        });

        return view;
    }
}

第一个xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#4ECDC4"
    android:id="@+id/frag1"
    >

<Button
    android:id="@+id/btnnext1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:text="NEXT" />

<EditText
    android:id="@+id/txtfname"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtmname"
    android:layout_alignParentTop="true"
    android:ems="10"
    android:hint="FIRST NAME" >

    <requestFocus />
</EditText>

<EditText
    android:id="@+id/txtmname"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txtfname"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="24dp"
    android:ems="10"
    android:hint="MIDDLE NAME" />

<EditText
    android:id="@+id/txtlname"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtmname"
    android:layout_below="@+id/txtmname"
    android:layout_marginTop="23dp"
    android:ems="10"
    android:hint="LAST NAME" />

<EditText
    android:id="@+id/txtdob"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtlname"
    android:layout_centerVertical="true"
    android:ems="10"
    android:hint="DOB" />

</RelativeLayout>

第二个片段:

package pl.looksok.viewpagerdemo;

import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public class FragmentGreen extends Fragment {
Button btnnext2,btnprev2;
RelativeLayout frag2;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_green, container, false);
        btnnext2=(Button) view.findViewById(R.id.btnnext2);
        btnprev2=(Button) view.findViewById(R.id.btnprev2);
        frag2=(RelativeLayout) view.findViewById(R.id.frag2);
        btnnext2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {


                ((MainActivity)getActivity()).selectFragment(2);

            }
        });
        btnprev2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                ((MainActivity)getActivity()).selectFragment(0);

            }
        });
        return view;
    }
}

第二个片段的xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#C7F464"
    android:id="@+id/frag2"
    >
<Button
    android:id="@+id/btnnext2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_marginRight="60dp"
    android:text="NEXT" />

<Button
    android:id="@+id/btnprev2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_marginRight="68dp"
    android:layout_toLeftOf="@+id/btnnext2"
    android:text="PREV" />

<EditText
    android:id="@+id/txtgender"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignRight="@+id/btnnext2"
    android:ems="10"
    android:hint="GENDER" />

<EditText
    android:id="@+id/txtmaritalstatus"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtgender"
    android:layout_below="@+id/txtgender"
    android:layout_marginTop="24dp"
    android:ems="10"
    android:hint="MARITAL STATUS" >

    <requestFocus />
</EditText>

<EditText
    android:id="@+id/txtoccupation"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtmaritalstatus"
    android:layout_below="@+id/txtmaritalstatus"
    android:layout_marginTop="23dp"
    android:ems="10"
    android:hint="OCCUPATION" />

<EditText
    android:id="@+id/txtusername"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtoccupation"
    android:layout_centerVertical="true"
    android:ems="10"
    android:hint="USERNAME" />

<EditText
    android:id="@+id/txtpassword"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txtusername"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:ems="10"
    android:hint="PASSWORD"
    android:inputType="textPassword" />

</RelativeLayout>

第三个片段:

package pl.looksok.viewpagerdemo;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.support.v4.app.Fragment;

public class FragmentPink extends Fragment {
Button btnnext3,btnprev3;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_pink, container, false);
        btnnext3=(Button) view.findViewById(R.id.btnnext3);
        btnprev3=(Button) view.findViewById(R.id.btnprev3);
        btnnext3.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {


            }
        });
        btnprev3.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                ((MainActivity)getActivity()).selectFragment(1);

            }
        });
        return view;
    }
}

第三个片段的xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF6B6B">

<Button
    android:id="@+id/btnnext3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:text="NEXT" />
<Button
    android:id="@+id/btnprev3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:text="PREV" />

<EditText
    android:id="@+id/txtaddress"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:ems="10"
    android:hint="ADDRESS" >

    <requestFocus />
</EditText>

<EditText
    android:id="@+id/txtdistrict"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtaddress"
    android:layout_below="@+id/txtaddress"
    android:layout_marginTop="30dp"
    android:ems="10"
    android:hint="DISTRICT" />

<EditText
    android:id="@+id/txtstate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txtdistrict"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="41dp"
    android:ems="10"
    android:hint="STATE" />

<EditText
    android:id="@+id/txtpincode"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txtstate"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="50dp"
    android:ems="10"
    android:hint="PINCODE" />

</RelativeLayout>

适配器:

package pl.looksok.viewpagerdemo;

import java.util.ArrayList;
import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MyPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
        this.fragments = new ArrayList<Fragment>();
        fragments.add(new FragmentBlue());
        fragments.add(new FragmentGreen());
        fragments.add(new FragmentPink());
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

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

我还创建了一个具有字符串值的类。我想知道我是否可以创建一个对象并将字段设置为该对象的属性

包含字段的类:

package pl.looksok.viewpagerdemo;

import java.io.Serializable;

public class RegistrationValues implements Serializable {

    String fname;
    String mname;
    String lname;
    String dob;
    String gender;
    String marital_status;
    String occupation;
    String username;
    String password;
    String address;
    String district;
    String state;
    String pincode;
    String nationality;
    String email;
    String phno;
    String bank_acno;
    String bank_branch;
    String bank_ifsc;
    String bank_swift;

}

所以问题是如何在不使用Sharedpreferences的情况下将第一个和第二个片段中的值传递给最后一个片段。

3 个答案:

答案 0 :(得分:1)

简单的方法是让RegistrationValues实例驻留在MainActivity实例中:

public class MainActivity extends FragmentActivity {
    ViewPager pager;
    RegistrationValues values; //add this
    public RegistrationValues getValues() { //add this
        return values; //add this
    }; //add this

在您的片段中,使用((MainActivity) getActivity()).getValues()更新值并实际获取第三个片段中的值。

注意:您应该将values个实例保存在MainActivity的{​​{1}}中,然后将其恢复到onSaveInstance的{​​{1}}。

答案 1 :(得分:0)

我认为对于在片段之间传递的值,您可以使用侦听器和调度程序模式以及管理侦听器和调度程序的单例模式,因为片段不是活动,您无法通过Intents传递值。

答案 2 :(得分:0)

一种非常常见的模式是片段提供一个接口,通过该接口可以将值传递给它们,并将包含活动用作集线器。要查看此示例,请使用Eclipse或Android Studio实例化新的Master / Detail Flow活动并查看ListActivity的代码。

但我认为,在这种情况下,你可能不想这样做。您的数据记录看起来像是要在持久层(Model)中维护的东西,可能通过服务(Controller)进行变异,并根据需要将其提取到片段(View)中。将UI与业务逻辑分开,并使用适配器使数据保持同步。