如何从tabLayout中的不同片段传输数据?

时间:2017-03-06 12:35:48

标签: android android-fragments android-tablayout

我将ListView的选定项目传递给另一个片段时遇到问题。

我有一个带有2个标签的TabbedActivity。 1st被称为 OngletCours ,第二个被称为 OngletNotes

我在传递我点击的项目时收到错误。

我已经尝试了整个周末但没有成功将我点击的项目转移到第二个标签/片段。

以下是我的第一个片段/标签 OngletCours 中的代码(我只显示了setOnItemClickListener:

     l1.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            OngletNotes fragment = ((Onglets)getActivity()).getOngletNotes();

            if(fragment == null) {
                fragment = OngletNotes.newInstance();
            }
            //récupération de la position convertie en String de l'item que j'ai choisi
            String item = l1.getItemAtPosition(i).toString();

            Bundle args = new Bundle();
            args.putString("Item",item);

            fragment.setArguments(args);

            getFragmentManager().beginTransaction().add(R.id.container, fragment).addToBackStack(null).commit();
            ((Onglets)getActivity()).goToFragment(1);
        }

    });

我的第二个标签/片段 OngletNotes 如下所示:

public class OngletNotes extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.ongletnotes, container, false);
    //where i want to insert the selectedItem
    TextView Cours = (TextView)rootView.findViewById(R.id.TVCours);

    Bundle bundle=getArguments();
    String cours="";
    //ERROR !
    cours = bundle.getString("Item");
    //Retrieve the value
    Cours.setText(cours);

    return rootView;
}

public static OngletNotes newInstance() {
    OngletNotes fragment = new OngletNotes();
    // put values which you want to pass to fragment
    // Bundle args = new Bundle();
    // fragment.setArguments(args);
    return fragment;
}

我有以下错误:

  

03-06 12:48:13.959 1033-1033 / com.example.dasilvadd.students E / AndroidRuntime:FATAL EXCEPTION:main                                                                                 显示java.lang.NullPointerException                                                                                     在com.example.dasilvadd.students.OngletNotes.onCreateView(OngletNotes.java:23)

第23行是以下一行:

  

Bundle bundle = getArguments();

请帮我解决这个问题,我真的需要在我的项目中取得进展。提前谢谢!

4 个答案:

答案 0 :(得分:2)

如果标签中只有两个framgent,请不要使用Bundle传输数据。

我会从一开始就解释你..

对于ViewPager,您需要正确的片段列表。就像下面一样

List<Fragment> fragmentsList = new ArrayList<Fragment>();
fragmentsList.add(Fragment1)-->OngletCours
fragmentsList.add(Fragment2)-->OngletNotes

您将在ViewPagerAdapter中传递上述列表。

在Fragment2中有一个功能,如下所示

 public void getDataFromFragmentOne(String item){
 // Do the mannipulation
 }

当项目在FragmentOne中点击时,只需调用上面的函数

  

((OngletNotes)getParentFragment.fragmentsList.get(1))。getDataFromFragmentOne(项目)..

上面应该可以正常工作。因为你没有处理onCreateView或onCreate中的数据..每当点击项目时你都会将数据传递给viewpager中已存在的第二层因为offsreenpage limt。

答案 1 :(得分:1)

使用共享首选项,在OngletCours中创建共享首选项,然后从OngletNotes中读取。所有客户端共享此类的单个实例,因此在这种情况下它是有意义的。转到此链接以刷新代码语法。https://developer.android.com/training/basics/data-storage/shared-preferences.html

嘿,为了将来的目的,请记住这一点,每当您存储数据时序列化您的数据。一个伟大的图书馆是gson。 Gson是一个Java库,可用于将Java对象转换为其JSON表示。它还可用于将JSON字符串转换为等效的Java对象。 Gson可以处理任意Java对象,包括你没有源代码的预先存在的对象。只需要考虑一下。

答案 2 :(得分:0)

试试这个

使用Bundle发送字符串:

YourFragment fragment = new YourFragment();
Bundle bundle = new Bundle();
bundle.putString("YourKey", "YourValue");
fragment.setArguments(bundle);

//Inflate the fragment
getFragmentManager().beginTransaction().add(R.id.container,fragment).commit();

在新片段的onCreateView中:

//Retrieve the value
    String value = getArguments().getString("YourKey");

我希望它适用于您的案例

答案 3 :(得分:0)

为您的片段提供构造函数

 public OngletNotes () {
        setArguments(new Bundle());
    }