将初始数据提供给片段(使用页面适配器)

时间:2014-05-14 08:17:38

标签: android android-fragments fragment bundle adapter

我遇到了问题,我希望在创建活动时,将我的活动extraData中的一个参数VenteActivity发送到他的一个片段PageAdjuFragment。 我在此活动中有3个片段用于在它们之间滑动,目前我只在PageAdjuFragment上工作。

我在stackoverflow上看到如何使用newinstantiate()PageAdjuFragment的新实例的参数中传递一个包,但这对我不起作用:(。

你可以在这里看到我的活动:

    public class VenteActivity extends FragmentActivity {

    private PagerAdapter mPagerAdapter;

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.viewpager2);
        creationPage();
        //Recovery
        Intent sender=getIntent();
        String extraData=sender.getExtras().getString("message");
        Log.v("nivyolo",extraData);//this is the argument which i would send
        //Sending
        PageAdjuFragment.newInstance(extraData); // the problem start here
    }

    public void creationPage() {
        // Creation of the list
        List<Fragment> fragments = new Vector<Fragment>();
        // Add Fragments in a list
        fragments.add(Fragment.instantiate(this,PageOffreFragment.class.getName()));
        fragments.add(Fragment.instantiate(this,PageAdjuFragment.class.getName()));
        fragments.add(Fragment.instantiate(this,PageNewPartFragment.class.getName()));
         // Creation of theadapter 
        this.mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(), fragments);
        ViewPager pager = (ViewPager) super.findViewById(R.id.viewpager2);
        // Affectation on the ViewPager
        pager.setAdapter(this.mPagerAdapter);
    }

    }

我希望将参数传递给创建

的片段
    public class PageAdjuFragment extends Fragment {

    public static PageAdjuFragment newInstance(String vente) {
        PageAdjuFragment myFragment = new PageAdjuFragment();

        Bundle args = new Bundle();
        args.putString("vente", vente);
        myFragment.setArguments(args);

        return myFragment;
    }

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



    //   super.onCreate(savedInstanceState);
        final View v=inflater.inflate(R.layout.page_adju_layout, container, false);
        final Button b=(Button)v.findViewById(R.id.btconf);
        final RadioGroup radiopmt = (RadioGroup) v.findViewById(R.id.radiopmt);
        final RadioButton rb1 = (RadioButton)v.findViewById(R.id.rb1);
        final RadioButton rb2 = (RadioButton)v.findViewById(R.id.rb2);
        final AutoCompleteTextView tv1 = (AutoCompleteTextView)v.findViewById(R.id.actv1);
        final AutoCompleteTextView tv2 = (AutoCompleteTextView)v.findViewById(R.id.actv2);
        final EditText tv3 = (EditText)v.findViewById(R.id.edt);

    ////START PROBLEM////////    

        String vente;
            // Recovery of the parameter
            Log.v("adju","before recup"); 
            Bundle arg = getArguments(); // the problem

            Log.v("adju","after recup"); 
            if (arg == null) {// all the time arg is null
                Log.v("args","arguments is null ");
                vente = "yolo";
            } else { 
                Log.v("args2","arguments not null ");
                vente= arg.getString("vente");
                Log.v("nivyolobonnepage",vente);

            }    
            tv3.setText(vente); //just a test


    ////END PROBLEM////////     


        //Data adaptation on TextAuto 
        List<String> OBJET = null;
        List<String> PARTI = null;
        try {
            OBJET = InitObjet();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            PARTI = InitPart();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_dropdown_item_1line, OBJET); 
        tv1.setAdapter(adapter);
        ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_dropdown_item_1line, PARTI); 
        tv2.setAdapter(adapter2);

        Log.v("papaouté","ici");        //Listerner Boutton Confirmer



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

        //Listener on the widget value's changes
    tv1.addTextChangedListener(new TextWatcher() {...});
    tv2.addTextChangedListener(new TextWatcher() {...});
        tv3.addTextChangedListener(new TextWatcher() {...});
        radiopmt.setOnCheckedChangeListener(new OnCheckedChangeListener() {...});



        return v;
    }




    //Create the List of object
    public List<String> InitObjet() throws IOException{...}

    //Create the List of participant
    public List<String> InitPart() throws IOException {...}

    //Write in the CSV FILE "achat"
    public void ecrire() throws IOException{...}


    }

最后是页面适配器

    public class MyPagerAdapter extends FragmentPagerAdapter {

    private final List<Fragment> fragments;

    //On fournit à l'adapter la liste des fragments à afficher
    public MyPagerAdapter(FragmentManager fm, List fragments) {
        super(fm);
        this.fragments = fragments;
    }

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

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

和wiewpager2.xml         

    <android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/viewpager2">
    </android.support.v4.view.ViewPager>

logCat

05-14 10:13:51.919: V/nivyolo(10005): vente1
05-14 10:13:52.169: V/adju(10005): before recup
05-14 10:13:52.169: V/adju(10005): after recup
05-14 10:13:52.169: V/args(10005): arguments is null 
05-14 10:13:52.209: V/papaouté(10005): ici

参数arg始终为空

1 个答案:

答案 0 :(得分:0)

PageAdjuFragment.newInstance(extraData); // the problem start here

是的,你有问题,因为你正在实例化一个片段并且没有使用它。

public class VenteActivity extends FragmentActivity {

private PagerAdapter mPagerAdapter;

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    super.setContentView(R.layout.viewpager2);
    creationPage();
}

public void creationPage() {
    // Creation of the list
    List<Fragment> fragments = new Vector<Fragment>();
    // Add Fragments in a list
    fragments.add(Fragment.instantiate(this,PageOffreFragment.class.getName()));

    //Recovery
    Intent sender=getIntent();
    String extraData=sender.getExtras().getString("message");
    Log.v("nivyolo",extraData);//this is the argument which i would send
    //Sending
    Fragment frag = PageAdjuFragment.newInstance(extraData); // no problem anymore
    fragments.add(frag);
    fragments.add(Fragment.instantiate(this,PageNewPartFragment.class.getName()));
     // Creation of theadapter 
    this.mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(), fragments);
    ViewPager pager = (ViewPager) super.findViewById(R.id.viewpager2);
    // Affectation on the ViewPager
    pager.setAdapter(this.mPagerAdapter);
}

}

那就是它。 : - )

你为什么要使用Fragment.instantiate()?它与使用新的Fragment()相同,但使用Java Reflection增加了性能损失(比使用普通构造函数长约2倍)。如果定义了静态方法,最好使用空构造函数或Fragment.newInstance()。