安卓bundle在替换片段后为空



我有两个片段,分别是VolleyFragment和OtherFragment,将VolleyFragment设置为初始片段。在此片段中,捆绑包数据显示正常。但是,当我转到AnotherFragment时,该应用程序崩溃了。它说这个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] android.os.Bundle.getStringArray(java.lang.String)' on a null object reference
                                                                                    at com.example.rendell.volleyfragment.AnotherFragment.onCreateView(AnotherFragment.java:28)

主活动

public class MainActivity extends AppCompatActivity {
public static final String JSON_URL = "http://192.168.0.102/musicmania/music/getMF";
TextView id,name,email;
String[] ids, names, emails;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    id = (TextView) findViewById(R.id.id);
    name = (TextView) findViewById(R.id.name);
    email = (TextView) findViewById(R.id.email);
    sendRequest();

}
private void sendRequest(){
    StringRequest stringRequest = new StringRequest(JSON_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    showJSON(response);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
                }
            });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}
private void showJSON(String json){
    ParseJSON pj = new ParseJSON(json);
    pj.parseJSON();
    id.setText(ParseJSON.ids[0]);
    name.setText(ParseJSON.titles[0]);
    email.setText(ParseJSON.artists[0]);
    FragmentManager fragmentTransaction = getFragmentManager();
    android.app.FragmentTransaction transaction = fragmentTransaction.beginTransaction();
    VolleyFragment squadFragment = new VolleyFragment();
    AnotherFragment anotherFragment = new AnotherFragment();
    Bundle bundle = new Bundle();
    bundle.putStringArray("id", ParseJSON.ids);
    bundle.putStringArray("name", ParseJSON.titles);
    bundle.putStringArray("email", ParseJSON.artists);
    squadFragment.setArguments(bundle);
    anotherFragment.setArguments(bundle);
    transaction.replace(R.id.containerView, squadFragment);
    transaction.commit();
}
public void changeFragment(View view) {
    FragmentManager fragmentTransaction = getFragmentManager();
    android.app.FragmentTransaction transaction = fragmentTransaction.beginTransaction();
    AnotherFragment anotherFragment = new AnotherFragment();
    transaction.replace(R.id.containerView, anotherFragment);
    transaction.commit();
    }
}

凌空片段

public class VolleyFragment extends Fragment {
TextView id,name,email;
String[] ids,names,emails;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.volley_fragment, container, false);
    id = (TextView) view.findViewById(R.id.id);
    name = (TextView) view.findViewById(R.id.name);
    email = (TextView) view.findViewById(R.id.email);
    ids = getArguments().getStringArray("id");
    names = getArguments().getStringArray("name");
    emails = getArguments().getStringArray("email");
    //jsonArray.setIds(id);
    id.setText(/*jsonArray.getIds()*/ids[0]);
    name.setText(names[0]);
    email.setText(emails[0]);
    return view;
    }
}

另一个片段

public class AnotherFragment extends Fragment {
TextView id,name,email;
String[] ids,names,emails;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.another_fragment, container, false);
    id = (TextView) view.findViewById(R.id.id);
    name = (TextView) view.findViewById(R.id.name);
    email = (TextView) view.findViewById(R.id.email);
    ids = getArguments().getStringArray("id");
    names = getArguments().getStringArray("name");
    emails = getArguments().getStringArray("email");
    //jsonArray.setIds(id);
    id.setText(/*jsonArray.getIds()*/ids[0]);
    name.setText(names[0]);
    email.setText(emails[0]);
    return view;
    }
}

我无法准确遵循您在这里所做的事情,但我看到许多问题:

  • 在showJSON中,你新建了一个ParseJSON对象并将其分配给pj,但永远不要使用pj。相反,您可以静态地访问 ParseJSON 以获取填充捆绑包的值。 这似乎真的很奇怪。我希望 pj 实例包含数据。
  • 通常,人们不会"更新"片段。通常的模式是在片段本身的类中使用静态构建器。
  • 您将相同的捆绑包传递给两个不同的片段。除非您知道某个事实没问题,否则请尝试为每个捆绑包使用不同的捆绑包。
  • 在showJSON中,你的AnotherFragment实例似乎根本没有被使用。
  • 我没有看到任何调用 changeFragment 的地方
  • 您在 Bundle 中传递字符串数组,但您只使用片段中数组中的第一个元素。 考虑只传递单个字符串?

相关内容

  • 没有找到相关文章

最新更新