【问题标题】:give initial data to fragments (with page adapter)为片段提供初始数据(使用页面适配器)
【发布时间】:2014-05-14 08:17:38
【问题描述】:

我有一个问题,我想在创建活动时从我的活动VenteActivity 向他的片段PageAdjuFragment 发送一个参数extraData。 我在这个活动中有 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>

日志猫

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 始终为空

【问题讨论】:

  • 我不知道为什么,但我无法编辑我的文本以在开头添加“Hello Guys :D”,对不起^^
  • 看看这条线Intent sender=getIntent(); - 什么开始你的VenteActivity?是否在Intent 中添加了额外内容?
  • 是的,来自另一个活动的另一个片段: Intent i = new Intent(getActivity(), VenteActivity.class); i.putExtra("消息",sp.getSelectedItem().toString());开始活动(一); getActivity().finish();在 onClick 按钮上;我设法恢复了另一个片段发送的 VenteActivity 中的额外内容,但我无法发送到另一个片段(PageAdjuFragment)
  • 我已经尝试过了:PageAdjuFragment f = new PageAdjuFragment();上下文上下文=getApplicationContext();捆绑参数 = 新捆绑(); args.putString("vente", extraData); f.setArguments(args); f.instantiate(context,PageAdjuFragment.class.getName(), args);我可以写 getContext() ;可能是问题所在?

标签: android android-fragments fragment bundle adapter


【解决方案1】:
PageAdjuFragment.newInstance(extraData); // the problem start here

是的,这是您的问题,因为您正在实例化 Fragment 并且没有使用它。

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()?它与使用 new Fragment() 相同,但使用 Java 反射会增加性能损失(大约是使用普通构造函数的 2 倍)。如果您定义了该静态方法,则最好使用空构造函数或 Fragment.newInstance()。

【讨论】:

  • 你是我的英雄!非常感谢,你救了我!祝你长寿。
猜你喜欢
  • 2011-10-22
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
相关资源
最近更新 更多