VehicleListActivity
はBundle
をフラグメントに渡します。 これは、アクティビティのonCreate
方法であって、フラグメントのonCreateViewは、アクティビティのonCreateの前に呼び出されます
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vehicle_list);
vehicles = new ArrayList<>();
Intent intent = getIntent();
String userID = intent.getStringExtra("userID");
LoadingVehicleListFragment f = new LoadingVehicleListFragment();
Bundle fArguments = new Bundle();
fArguments.putString("userID", userID);
f.setArguments(fArguments);
getSupportFragmentManager().beginTransaction().add(R.id.loadingVehicleFragment, f).commit();
}
、これはフラグメントのonCreateView
です:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
activity = (VehicleListActivity)getActivity();
context = activity;
listener = activity;
String userID = getArguments().getString("userID");
getUserInformation(userID);
return inflater.inflate(com.devspark.progressfragment.R.layout.fragment_progress, container, false);
}
私はフラグメントのonCreateView
が活動のonCreate
前に呼び出されていることに気づいたので、私のフラグメントでがnullを返し、どのNULLポインター例外が発生します。 この例外を回避するには、どこにを置く必要がありますか?
EDIT:これはエラーログです
public class LoadingVehicleListFragment extends ProgressFragment
{
private VehicleListListener listener;
private VehicleListActivity activity;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(com.devspark.progressfragment.R.layout.fragment_progress, container, false);
}
/*@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
int c = 0;
listener = (VehicleListActivity)getActivity();
getUserInformation(getArguments().getString("userID"));
}*/
private void getUserVehicles(String userID)
{
Response.Listener<String> responseListener = new Response.Listener<String>()
{
@Override
public void onResponse(String response)
{
try
{
HashMap resultMap = new ObjectMapper().readValue(response, HashMap.class);
VehicleListRequest.ErrorCode errorCode = VehicleListRequest.ErrorCode.fromInt(Integer.parseInt(resultMap.get("error_code").toString()));
switch (errorCode)
{
case NONE:
parseVehicleFromMap(resultMap);
break;
case EXCEPTION_CAUGHT:
AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity());
builder2.setMessage("Eccezione catturata. \n Messaggio: " + resultMap.get("error_message"));
builder2.create().show();
break;
}
}
catch (IOException e)
{
// TODO gestire
e.printStackTrace();
}
}
};
VehicleListRequest request = new VehicleListRequest(userID, responseListener, null);
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
requestQueue.add(request);
}
public void getUserInformation(final String userID)
{
Response.Listener<String> responseListener = new Response.Listener<String>()
{
@Override
public void onResponse(String response)
{
try
{
HashMap resultMap = new ObjectMapper().readValue(response, HashMap.class);
GetUserRequest.ErrorCode errorCode = GetUserRequest.ErrorCode.fromInt(Integer.parseInt(resultMap.get("error_code").toString()));
switch (errorCode)
{
case NONE:
listener.setLoggedUser(User.fromMap(resultMap));
getUserVehicles(userID);
break;
case EXCEPTION_CAUGHT:
AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity());
builder2.setMessage("Eccezione catturata. \n Messaggio: " + resultMap.get("error_message"));
builder2.create().show();
break;
}
}
catch (IOException e)
{
// TODO gestire
e.printStackTrace();
}
}
};
GetUserRequest request = new GetUserRequest(userID, responseListener, null);
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
requestQueue.add(request);
}
private void parseVehicleFromMap(HashMap map)
{
int i = 0;
while (map.containsKey(String.valueOf(i)))
{
final Vehicle v = new Vehicle();
HashMap vehicleMap = (HashMap) map.get(String.valueOf(i));
v.setPlate(vehicleMap.get("plate").toString());
v.setKm(vehicleMap.get("km") == null ? null : Integer.parseInt(vehicleMap.get("km").toString()));
v.setInUse(Integer.parseInt(vehicleMap.get("in_use").toString()) == 1);
v.setFuelQuantity(Double.parseDouble(vehicleMap.get("actual_fuel_quantity").toString()));
v.setEffectiveFuelEconomy(Double.parseDouble(vehicleMap.get("effective_fuel_economy").toString()));
v.setInsuranceDate(vehicleMap.get("insurance_date") == null ? null : new LocalDate(vehicleMap.get("insurance_date").toString()));
v.setMatriculationDate(new LocalDate(vehicleMap.get("matriculation_date").toString()));
v.setLatitude(vehicleMap.get("latitude") == null ? null : Double.parseDouble(vehicleMap.get("latitude").toString()));
v.setLongitude(vehicleMap.get("longitude") == null ? null : Double.parseDouble(vehicleMap.get("longitude").toString()));
v.setUser(activity.getLogged());
listener.addVehicle(v);
i++;
}
}
} // end class
::これは全体のフラグメントの源である要求に応じてこれらの例外の前
03-27 18:30:47.274 4966-4966/clyky.cartracker E/AndroidRuntime: FATAL EXCEPTION: main
Process: clyky.cartracker, PID: 4966
java.lang.RuntimeException: Unable to start activity ComponentInfo{clyky.cartracker/clyky.cartracker.activities.VehicleListActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5458)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
at clyky.cartracker.activities.fragments.LoadingVehicleListFragment.onActivityCreated(LoadingVehicleListFragment.java:51)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2193)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1323)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1523)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1585)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2832)
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:603)
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1237)
at android.app.Activity.performStart(Activity.java:6268)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2397)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5458)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
、私はいくつかの「失敗したバインダー取引」をも持っていますこれらのような:
03-27 18:30:41.955 1452-1452/com.google.android.inputmethod.latin E/JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 100)
3月27日18:30:41.956 1452から1452/com.google.android.inputmethod.latin E/Androi dime:aqx:java.lang.RuntimeException:android.os.DeadObjectException:小さなパーセルでトランザクションが失敗しました。リモートプロセスがおそらく終了しました 03-27 18:30:41.999 1452-1452/com.google.android.inputmethod.latin E/JavaBinder:!!! FAILED BINDER TRANSACTION !!! (パーセルサイズ= 100) 03-27 18:30:42.000 1452-1452/com.google.android.inputmethod.latin E/AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:トランザクションが小規模で失敗しました小包;リモートプロセスがおそらく終了した 03-27 18:30:42.001 1452-1452/com.google.android.inputmethod.latin E/JavaBinder:!!! FAILED BINDER TRANSACTION !!! (パーセルサイズ= 100) 03-27 18:30:42.002 1452-1452/com.google.android.inputmethod.latin E/AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:トランザクションが小規模で失敗しました小包;リモートプロセスがおそらく終了しました 03-27 18:30:42.005 1452-1452/com.google.android.inputmethod.latin E/JavaBinder:!!! FAILED BINDER TRANSACTION !!! (小包サイズ= 100) 03-27 18:30:42.007 1452-1452/com.google.android.inputmethod.latin E/AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:トランザクションが小規模で失敗しました小包;リモートプロセスがおそらく終了しました 03-27 18:30:42.008 1452-1452/com.google.android.inputmethod.latin E/JavaBinder:!!! FAILED BINDER TRANSACTION !!! (パーセルサイズ= 100) 03-27 18:30:42.010 1452-1452/com.google.android.inputmethod.latin E/AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:トランザクションが小規模で失敗しました小包;リモートプロセスがおそらく終了しました 03-27 18:30:42.026 1452-5094/com.google.android.inputmethod.latin E/JavaBinder:!!! FAILED BINDER TRANSACTION !!! (小包サイズ= 168) 03-27 18:30:42.031 1452-5095/com.google.android.inputmethod.latin E/JavaBinder:!!! FAILED BINDER TRANSACTION !!! (小包サイズ= 168) 03-27 18:30:43.509 1452-1452/com.google.android.inputmethod.latin E/JavaBinder:!!! FAILED BINDER TRANSACTION !!! (パーセルサイズ= 100) 03-27 18:30:43.510 1452-1452/com.google.android.inputmethod.latin E/AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:トランザクションが小規模で失敗しました小包;リモートプロセスがおそらく終了した 03-27 18:30:43.510 1452-1452/com.google.android.inputmethod.latin E/JavaBinder:!!! FAILED BINDER TRANSACTION !!! (小包サイズ= 100) 03-27 18:30:43.512 1452-1452/com.google.android.inputmethod.latin E/AndroidIME:aqx:java.lang.RuntimeException:android.os。DeadObjectException:小包でトランザクションが失敗しました。リモートプロセスがおそらく終了しました 03-27 18:30:43.542 1452-5121/com.google.android.inputmethod.latin E/JavaBinder:!!! FAILED BINDER TRANSACTION !!! (小包サイズ= 168) 03-27 18:30:43.547 1452-5120/com.google.android.inputmethod.latin E/JavaBinder:!!! FAILED BINDER TRANSACTION !!! (パーセルサイズ= 168)
ただし、例外をスローする操作の前に表示されるので、これらのエラーは影響がないと思います。
なぜonCreateviewでsuper.onAttachを呼び出していますか?また、 'onCraateView'の' getArguments() 'で、より遅いonCreateViewの実行を遅らせることができます – Bhargav
@Bhargav' onAttach'を残念に思っています。コピーペーストエラーでした。なぜならフラグメントの 'onAttach '最初に – Clyky
待っていると断片のためにも膨らんで見る? – Remario