【问题标题】:Pass String Array from one fragment to another将字符串数组从一个片段传递到另一个片段
【发布时间】:2016-08-01 07:53:22
【问题描述】:

我正在使用一个String []在fragmentone的ListView中显示并将String []传递给具有listView的fragmentTwo。我在下面尝试过的代码,

主活动:

public class MainActivity extends FragmentActivity implements ListInterface {

private FragmentOne fragmentOne;
private FragmentTwo fragmentTwo;

@Override
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate (savedInstanceState);
    setContentView (R.layout.activity_main);

     fragmentOne = new FragmentOne ();
    fragmentTwo = new FragmentTwo ();

    FragmentManager fragmentManager = getSupportFragmentManager ();
    android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction ();

    fragmentTransaction.add (R.id.frame_one,fragmentOne);
    fragmentTransaction.add (R.id.frame_two , fragmentTwo);

    fragmentTransaction.commit ();
}

@Override
public void getValue (String[] s) {
    fragmentTwo.setValue (s);
}}

片段一:

public class FragmentOne extends Fragment {

private ListView listView;
private ListInterface listInterface;
String [] listData = {"Dhana","Rahul","Strobs","Uday","Selvi"};

@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate (R.layout.fragment_one,container,false);
    listView = (ListView)view.findViewById (R.id.lst_view);
    ArrayAdapter adapter = new ArrayAdapter (getActivity (),R.layout.fragment_one,listData);
    listView.setAdapter (adapter);
    return view;
}

@Override
public void onAttach (Context context) {
    super.onAttach (context);

    if(context instanceof  ListInterface){
        listInterface =(ListInterface)context;
        listInterface.getValue (listData);
    }else{
        throw new ClassCastException (context.toString ()+"mess ");
    }
}}

片段二:

public class FragmentTwo extends Fragment {

private ListView listView;

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

    View view = inflater.inflate (R.layout.fragment_two,container,false);
    listView = (ListView)view.findViewById (R.id.lst_view_two);
    return view;
}

public void setValue (String [] value){
    ArrayAdapter adapter = new ArrayAdapter (getActivity (),R.layout.fragment_two,value);
    listView.setAdapter (adapter);
}}

列表接口:

public interface ListInterface {

public void getValue (String [] s);}

我尝试了我的代码,它显示了

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
 FragmentTwo.setValue(FragmentTwo.java:27)
 MainActivity.getValue(MainActivity.java:31)
 FragmentOne.onAttach(FragmentOne.java:37)

【问题讨论】:

    标签: android listview interface


    【解决方案1】:

    你可以这样设置数据。

    public static BuyerToyFragment newInstance(String yourText) {
            FragmentOne fragment = new FragmentOne ();
            Bundle args = new Bundle();
            args.putString(ARG_PARAM1, yourText);
            fragment.setArguments(args);
            return fragment;
        }
    

    现在在 fragmentOne 中,您需要获取这样的数据。

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getArguments() != null) {
                String myStringData = getArguments().getString(ARG_PARAM1);
            }
        }
    

    在您的 MainActivity 中,您可以像这样设置数据。

    // you can add string array as well. i dont remember the tag exactely. i its 
    //like putStingArray() but you need to check it yourself
    
    fragmentOne = new FragmentOne ().newInstance("Your data goes here");
    

    您需要对片段 2 执行相同操作

    【讨论】:

      【解决方案2】:

      我不是很明白你的列表界面的作用。

      我也不明白你为什么要静态调用 setValue 和 getValue...

      1/最简单的方法是将列表存储在您的活动中,然后从片段中访问它,例如 onViewCreated。

      活动:

      public String[] getMyList() {
          return mMyList;
      }
      

      您还需要使用 setter 从另一个片段设置列表。

      从片段中访问您的列表:

      String[] listFromActivity = ((MainActivity) getActivity()).getMyList();
      

      2/一种更简洁的方法是将列表作为参数传递给片段。

      活动中:

      FragmentOne frO = new FragmentOne();
      Bundle bundle = new Bundle();
      bundle.putStringArray(mMyList, "my_list_key");
      frO.setArguments(bundle);
      

      在片段中:

      String[] listFromActivity = getArguments().getStringArray("my_list_key");
      

      如果您想更新列表,则解决方案 1 更容易,如果您的列表不会更改,则解决方案 2 更简洁。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 2017-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多