0

VolleyFragment と AnotherFragment の 2 つのフラグメントがあり、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;
    }
}
4

1 に答える 1

0

あなたがここでやっていることを正確に理解するのに苦労していますが、いくつかの問題があります:

  • showJSON では、ParseJSON オブジェクトを新しく作成して pj に割り当てますが、pj を使用することはありません。代わりに、ParseJSON に静的にアクセスして、値をバンドルに入力します。それは本当に奇妙に思えます。pj インスタンスにデータが含まれていると思います。
  • 通常、フラグメントを「新しく」作成することはありません。通常のパターンは、フラグメント自体のクラスで静的ビルダーを使用することです。
  • 同じバンドルを 2 つの異なるフラグメントに渡しています。問題がないことがわかっている場合を除き、代わりにそれぞれに別のバンドルを使用してみてください。
  • showJSON では、AnotherFragment インスタンスはまったく使用されていないようです
  • changeFragment が呼び出される場所が見当たりません
  • バンドルで文字列配列を渡していますが、フラグメント内の配列の最初の要素のみを使用しています。代わりに単一の文字列を渡すことを検討してください。
于 2016-02-07T18:30:16.527 に答える