2017-03-27 11 views
0

VehicleListActivityBundleをフラグメントに渡します。 これは、アクティビティの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)

ただし、例外をスローする操作の前に表示されるので、これらのエラーは影響がないと思います。

+0

なぜonCreateviewでsuper.onAttachを呼び出していますか?また、 'onCraateView'の' getArguments() 'で、より遅いonCreateViewの実行を遅らせることができます – Bhargav

+0

@Bhargav' onAttach'を残念に思っています。コピーペーストエラーでした。なぜならフラグメントの 'onAttach '最初に – Clyky

+0

待っていると断片のためにも膨らんで見る? – Remario

答えて

1

onActivityCreated()は、ホストアクティビティの作成時にonCreateView()メソッドの後に呼び出されます。アクティビティーおよびフラグメント・インスタンス、およびアクティビティーのビュー階層が作成されました。この時点で、ビューはfindViewById()メソッドでアクセスできます。例。このメソッドでは、Contextオブジェクトを必要とするオブジェクトをインスタンス化できます。

も断片で店舗のコンテキストは常にそれがフラグメントのための時間だときにシステムがこのコールバックを呼び出しonCreateView()、NULLポインタがアンドロイドの枠組み内での実行の流れによって引き起こされていることgetActivity()

を呼び出すことはありません、そこにアクセスしてみてくださいはじめてユーザーインターフェースを描く。フラグメントのUIを描画するには、フラグメントのレイアウトのルートであるこのメソッドからViewコンポーネントを返す必要があります。フラグメントがUIを提供しない場合、nullを返すことができます。 したがって、最初に呼び出されるため、NULLポインタ例外が発生します。

+0

そのメソッドで引数を取得してみてください。 – Remario

+0

あなたの答えに感謝します。私はあなたが言ったように 'onActivityCreated'で引数を取得しようとしましたが、それでも動作しません。今アクティビティの 'onCreated'はうまく呼び出されますが、' onActivityCreated'は呼び出されません(呼び出されたブレイクポイントはありません) – Clyky

+0

これは有線です。興味のあるコンテンツを共有するために共有プリファレンスファイルを使用することをおすすめします。 – Remario

0

これを試すことができますか?

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_vehicle_list); 
    vehicles = new ArrayList<>(); 

    String userID; 
    Bunlde bundle = getIntent().getExtras(); 
    if(bundle != null){ 
     userID = bundle.getString("userID"); 
    } 

    if(savedInstanceState == null){ 
      LoadingVehicleListFragment f = new LoadingVehicleListFragment(); 
      Bundle fArguments = new Bundle(); 
      fArguments.putString("userID", userID); 
      f.setArguments(fArguments); 
      getSupportFragmentManager().beginTransaction().replace(R.id.loadingVehicleFragment, f).commit(); 
    } 
} 
+0

ありがとう、私はこれを試しましたが、 'onActivityCreated'の' getArguments'はまだnullを返します – Clyky

+0

あなたはフラグメントコード全体を送ることができますか?何かが間違っています。 – savepopulation

+0

はい、私はその最初の投稿を編集しました – Clyky

関連する問題