如何从Activity向Fragment发送JSON数据?

3

我正在尝试从JSON中获取数据,并将数据的一部分发送到所有片段。

这是我的代码:

    private void setupViewPager(ViewPager viewPager,ArrayList<Product> productname,int p) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        Bundle args = new Bundle();
 }
        String price = productname.get(1).getPrice();
        args.putString("key", price);
        TheFragment tf1 = new TheFragment();
        TheFragment tf2 = new TheFragment();
        TheFragment tf3 = new TheFragment();
        TheFragment tf4 = new TheFragment();
        adapter.addFragment(tf1 , "ONE");
        tf1.setArguments(args);
        adapter.addFragment(tf2 , "Two");
        tf2.setArguments(args);
        adapter.addFragment(tf3 , "Three");
        tf3.setArguments(args);
        adapter.addFragment(tf4 , "Four");
        tf4.setArguments(args); 

 //3      adapter.addFragment(new TheFragment(), "TWO"); // Can I send data by coding this way?
 //3     adapter.addFragment(new TheFragment(), "THREE");
 //3       adapter.addFragment(new TheFragment(),"THE 4");
       viewPager.setAdapter(adapter);
    }

在此之前,我已经从数组列表中检索到了JSON值,n=jsonArray.length();
setupViewPager(viewPager,arrayList,n);

JSON文件包含名称,价格和图像。我想在我的片段中显示价格。
public class TheFragment extends Fragment {

    TextView tv;
    public TheFragment() {

    }
    String value = getArguments().getString("key");

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    /*    if(value!=null){
            tv.setText(value);
        } */

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_this, container, false);
        tv = (TextView) getView().findViewById(R.id.thePrice);
        tv.setText(value);
        return view;
    }
}

代码没有显示任何错误,但应用程序无法运行。我做错了什么,有哪些可能的解决方案?谢谢。


当您向它们发送JSON时,您的片段是否已经打开。 - Jitesh Mohite
我的碎片在我没有发送任何内容的情况下打开,但是当我试图发送数据并想要在片段布局的文本视图中设置文本时,它不起作用。 - Saket
2个回答

1
将代码片段中的这行代码更改 -
   public class TheFragment extends Fragment {

    TextView tv;
    public TheFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_this, container, false);
    }

   @Override
   public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
       super.onViewCreated(view, savedInstanceState);
       tv = (TextView) view.findViewById(R.id.thePrice);
   }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        String price = getArguments().getString("key");
        tv.setText(price);
    }
}

希望一切顺利工作。

它将如何工作?片段已经在顶部,因此现在您将无法在onActivityCreated()中获取值。 - Jitesh Mohite
@jiteshmohite 我已经运行了代码,它可以正常工作,因为在设置参数后调用了 viewPager.setAdapter(adapter)。并且所有数据都已预加载。因此,当适配器附加片段时,它一定会经过 onActivityCreated()。 - Barno
@Saket,非常荣幸。 :) 如果对您有帮助,请尝试接受答案。 - Barno
我是新来的这里,试图接受邀请但它要求15+的声望。非常抱歉,但我并不了解它所询问的声望是什么。 - Saket
没关系。:D 我只是开玩笑。我很高兴能帮到你。谢谢。 :) - Barno
@Saket:答案下方应该有一个勾选标记。点击该勾选标记以接受答案。没有声望限制执行该操作。 - Muntasir

0

你好,在片段中使用以下的newInstance方法。

public static Fragment newInstance(ArrayList<Product> jsonData) {

            Bundle args = new Bundle();
            args.putStringArrayList("Key","jsonDatainArray");
            fragment.setArguments(args);
            return fragment;
}

并将片段初始化如下

 TheFragment theFragment= TheFragment.newInstance("arrayListHere");

在Fragment中,使用getArguments()方法在onCreateViewonCreate中获取ArrayList。

你可以将数据作为JSON字符串放置。 - SriMaharshi Manchem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接