简体   繁体   English

在活动的onCreate之前调用片段的onCreateView

[英]Fragment's onCreateView called before activity's onCreate

I have my VehicleListActivity which passes a Bundle to my fragment. 我有我的VehicleListActivity ,它将Bundle传递给我的片段。 This is activity's onCreate method: 这是活动的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();
}

and this is fragment's onCreateView : 这是片段的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);
}

I've noticed that fragment's onCreateView is called before activity's onCreate , so getArguments() in my fragment returns a null, which causes a null pointer exception. 我注意到片段的onCreateView在活动的onCreate之前被调用,因此片段中的getArguments()返回null,这将导致null指针异常。 Where should I put getArguments() in my fragment to avoid this exception? 我应该在片段中的哪里放置getArguments()以避免发生此异常?

EDIT: as requested this is the whole fragment's source: 编辑:根据要求,这是整个片段的来源:

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

this is error logs: 这是错误日志:

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) 

before of these exceptions, I've also got some "failed binder transactions", like these: 在这些例外之前,我还遇到了一些“联名交易失败”,例如:

03-27 18:30:41.955 1452-1452/com.google.android.inputmethod.latin E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 100)

03-27 18:30:41.956 1452-1452/com.google.android.inputmethod.latin E/AndroidIME: aqx: java.lang.RuntimeException: android.os.DeadObjectException: Transaction failed on small parcel; 03-27 18:30:41.956 1452-1452 / com.google.android.inputmethod.latin E / AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:小宗包裹交易失败; remote process probably died 03-27 18:30:41.999 1452-1452/com.google.android.inputmethod.latin E/JavaBinder: !!! 远程进程可能死了03-27 18:30:41.999 1452-1452 / com.google.android.inputmethod.latin E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 绑定交易失败!!! (parcel size = 100) 03-27 18:30:42.000 1452-1452/com.google.android.inputmethod.latin E/AndroidIME: aqx: java.lang.RuntimeException: android.os.DeadObjectException: Transaction failed on small parcel; (包裹大小= 100)03-27 18:30:42.000 1452-1452 / com.google.android.inputmethod.latin E / AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:小包裹交易失败; remote process probably died 03-27 18:30:42.001 1452-1452/com.google.android.inputmethod.latin E/JavaBinder: !!! 远程进程可能死了03-27 18:30:42.001 1452-1452 / com.google.android.inputmethod.latin E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 绑定交易失败!!! (parcel size = 100) 03-27 18:30:42.002 1452-1452/com.google.android.inputmethod.latin E/AndroidIME: aqx: java.lang.RuntimeException: android.os.DeadObjectException: Transaction failed on small parcel; (包裹大小= 100)03-27 18:30:42.002 1452-1452 / com.google.android.inputmethod.latin E / AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:小包裹交易失败; remote process probably died 03-27 18:30:42.005 1452-1452/com.google.android.inputmethod.latin E/JavaBinder: !!! 远程进程可能死了03-27 18:30:42.005 1452-1452 / com.google.android.inputmethod.latin E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 绑定交易失败!!! (parcel size = 100) 03-27 18:30:42.007 1452-1452/com.google.android.inputmethod.latin E/AndroidIME: aqx: java.lang.RuntimeException: android.os.DeadObjectException: Transaction failed on small parcel; (包裹大小= 100)03-27 18:30:42.007 1452-1452 / com.google.android.inputmethod.latin E / AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:小包裹交易失败; remote process probably died 03-27 18:30:42.008 1452-1452/com.google.android.inputmethod.latin E/JavaBinder: !!! 远程进程可能死了03-27 18:30:42.008 1452-1452 / com.google.android.inputmethod.latin E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 绑定交易失败!!! (parcel size = 100) 03-27 18:30:42.010 1452-1452/com.google.android.inputmethod.latin E/AndroidIME: aqx: java.lang.RuntimeException: android.os.DeadObjectException: Transaction failed on small parcel; (包裹大小= 100)03-27 18:30:42.010 1452-1452 / com.google.android.inputmethod.latin E / AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:小包裹上的交易失败; remote process probably died 03-27 18:30:42.026 1452-5094/com.google.android.inputmethod.latin E/JavaBinder: !!! 远程进程可能死了03-27 18:30:42.026 1452-5094 / com.google.android.inputmethod.latin E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 绑定交易失败!!! (parcel size = 168) 03-27 18:30:42.031 1452-5095/com.google.android.inputmethod.latin E/JavaBinder: !!! (包裹大小= 168)03-27 18:30:42.031 1452-5095 / com.google.android.inputmethod.latin E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 绑定交易失败!!! (parcel size = 168) 03-27 18:30:43.509 1452-1452/com.google.android.inputmethod.latin E/JavaBinder: !!! (包裹大小= 168)03-27 18:30:43.509 1452-1452 / com.google.android.inputmethod.latin E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 绑定交易失败!!! (parcel size = 100) 03-27 18:30:43.510 1452-1452/com.google.android.inputmethod.latin E/AndroidIME: aqx: java.lang.RuntimeException: android.os.DeadObjectException: Transaction failed on small parcel; (包裹大小= 100)03-27 18:30:43.510 1452-1452 / com.google.android.inputmethod.latin E / AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:小包裹交易失败; remote process probably died 03-27 18:30:43.510 1452-1452/com.google.android.inputmethod.latin E/JavaBinder: !!! 远程进程可能死了03-27 18:30:43.510 1452-1452 / com.google.android.inputmethod.latin E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 绑定交易失败!!! (parcel size = 100) 03-27 18:30:43.512 1452-1452/com.google.android.inputmethod.latin E/AndroidIME: aqx: java.lang.RuntimeException: android.os.DeadObjectException: Transaction failed on small parcel; (包裹大小= 100)03-27 18:30:43.512 1452-1452 / com.google.android.inputmethod.latin E / AndroidIME:aqx:java.lang.RuntimeException:android.os.DeadObjectException:小包裹交易失败; remote process probably died 03-27 18:30:43.542 1452-5121/com.google.android.inputmethod.latin E/JavaBinder: !!! 远程进程可能死了03-27 18:30:43.542 1452-5121 / com.google.android.inputmethod.latin E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 绑定交易失败!!! (parcel size = 168) 03-27 18:30:43.547 1452-5120/com.google.android.inputmethod.latin E/JavaBinder: !!! (包裹大小= 168)03-27 18:30:43.547 1452-5120 / com.google.android.inputmethod.latin E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 绑定交易失败!!! (parcel size = 168) (包裹大小= 168)

however, they starts to appear before the operations that throw exception, so I think that these errors aren't influential. 但是,它们开始出现在引发异常的操作之前,因此我认为这些错误没有影响。

The onActivityCreated() is called after the onCreateView() method when the host activity is created. 创建主机活动时,将在onCreateView()方法之后调用onActivityCreated() Activity and fragment instance have been created as well as the view hierarchy of the activity. 活动和片段实例以及活动的视图层次结构已创建。 At this point, view can be accessed with the findViewById() method. 此时,可以使用findViewById()方法访问视图。 example. 例。 In this method you can instantiate objects which require a Context object. 在这种方法中,您可以实例化需要Context对象的对象。

Try accessing it there, also do not store context in fragments always call getActivity() 尝试在那里访问它,也不getActivity()上下文存储在片段中,请始终调用getActivity()

That Null Pointer is caused by the flow of execution in the android framework, onCreateView() The system calls this callback when it's time for the fragment to draw its user interface for the first time. 空指针是由android框架onCreateView()的执行流引起的。当该片段第一次绘制其用户界面时,系统将调用此回调。 To draw a UI for your fragment, you must return a View component from this method that is the root of your fragment's layout. 要为片段绘制UI,必须从此方法返回一个View组件,该组件是片段布局的根。 You can return null if the fragment does not provide a UI. 如果片段不提供UI,则可以返回null。 Therefore it is called first, hence giving the null pointer exception. 因此,它首先被调用,因此给出了空指针异常。

Can you try this? 你可以试试这个吗?

@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();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在完成onCreate中的活动时,我的片段onCreateView在onCreate之前是如何调用的? - How is my fragment's onCreateView called before it's onCreate when finishing the activity in onCreate? Fragment 的 onCreate 和 onCreateView 没有被调用 - Fragment's onCreate and onCreateView are not called 为什么调用片段onCreateView,onCreate,onActivityCreated - Why does the fragment's onCreateView, onCreate, onActivityCreated are called 为什么 Fragment 的 onCreate() 有时会先于 Activity 的 onCreate() 被调用? - Why Fragment's onCreate() is sometimes called prior to Activity's onCreate()? 是否可以在 Activity 的 onCreate 完成之前调用片段的 onAttach? - Can a fragment's onAttach be called before the Activity's onCreate has finished? 在Activity onRestoreInstanceState()之前调用Fragment的onCreateView() - onCreateView() for Fragment being called before Activity onRestoreInstanceState() 在transaction.com发布之前调用片段的onCreate - Fragment's onCreate is being called before transaction.commit 当Fragment的onCreateView调用时,Android OutOfMemoryError - Android OutOfMemoryError when Fragment's onCreateView called 片段的 onCreateView 被多次调用 - fragment's onCreateView called multiple times Android:屏幕旋转时,Fragment的onCreate()和onCreateView()应该做什么 - Android: on screen rotation what should Fragment's onCreate() and onCreateView() do
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM