Android Studio:当headlessfragment调用时,java.lang.NullPointerException错误 [英] Android Studio: Error of java.lang.NullPointerException when the headlessfragment called

查看:46
本文介绍了Android Studio:当headlessfragment调用时,java.lang.NullPointerException错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个主活动和一个无头片段.
无头Fragment应该获取要记录的电话的IMEI号码,并返回到主Activity.
我已经有几个小时的错误了,我似乎无法摆脱它.

I have a main Activity and a headless Fragment.
The headless Fragment is supposed to get the IMEI number of the phone to be recorded and returned to the main Activity.
I had this bug for a few hours now and I can't seem to shake it off.

这是logcat:

E/AndroidRuntime: FATAL EXCEPTION: main
                      Process: com.androidproject.example, PID: 5418
                      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidproject.example/com.androidproject.example.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.app.Activity.getApplicationContext()' on a null object reference
                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                          at android.app.ActivityThread.-wrap11(ActivityThread.java)
                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                          at android.os.Handler.dispatchMessage(Handler.java:102)
                          at android.os.Looper.loop(Looper.java:148)
                          at android.app.ActivityThread.main(ActivityThread.java:5417)
                          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 'android.content.Context android.app.Activity.getApplicationContext()' on a null object reference
                          at com.androidproject.example.HeadlessFragment.loadIMEI(HeadlessFragment.java:110)
                          at com.androidproject.example.MainActivity.onCreate(MainActivity.java:40)
                          at android.app.Activity.performCreate(Activity.java:6237)
                          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                          at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                          at android.os.Handler.dispatchMessage(Handler.java:102) 
                          at android.os.Looper.loop(Looper.java:148) 
                          at android.app.ActivityThread.main(ActivityThread.java:5417) 
                          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) 
    Application terminated.

这是MainActivity中代码的相关部分:

And here's the relevant part of the code in the MainActivity:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDeviceCode = (TextView)findViewById(R.id.device_code);

        // Initializing headless fragment
        mFragment =
                (HeadlessFragment) getFragmentManager()
                        .findFragmentByTag("IMEILoader");

        if(mFragment == null) {
            mFragment = new HeadlessFragment();
            getFragmentManager().beginTransaction()
                    .add(mFragment, "IMEILoader").commit();
        }
        if(mFragment != null){
            mNumber = mFragment.loadIMEI(); //Here's the error
            mDeviceCode.setText(Html.fromHtml("<b>IMEI</b>: " + mFragment.loadIMEI()));
        }

这是HeadlessFragment代码:

And here's the HeadlessFragment code:

    //Called when the 'loadIMEI' function is triggered.
    public String loadIMEI() {

        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            // READ_PHONE_STATE permission has not been granted.
            requestPermissions();
        } else {
            // READ_PHONE_STATE permission is already been granted.
            RecordedIMEI = permissionGrantedActions();
        }
        if(RecordedIMEI != null) {
            Log.i("loadIMEIService", "IMEI number returned!");
        }
        return RecordedIMEI;
    }

    public String permissionGrantedActions() {


        //Get IMEI Number of Phone
        TelephonyManager tm =(TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE);

        String IMEINumber = tm.getDeviceId();

        //RecordedIMEI = IMEINumber;

        if(IMEINumber != null) {
            Log.i("IMEI Loader", "IMEI number recorded!");
        }
        return IMEINumber;
    }
}

我尝试了不同的尝试,但是没有运气.我认为 getActivity().getApplicationContext()没有指向任何地方,这意味着这是在将无头片段附加到mainactivity上之前调用的吗?
我已经坚持了很长时间,需要一些帮助.

I tried different things but no luck. I think getActivity().getApplicationContext() is pointing no where, which means this is being called before headless fragment is attached to mainactivity?
I've been stuck on this for quite some time and need some help.

推荐答案

更改此行

 mNumber = mFragment.loadIMEI();

收件人

 mNumber = mFragment.loadIMEI(MainActivity.this);

您的功能将是这样.

public String loadIMEI(Context context) {
        //Context context = getActivity().getApplicationContext();
        //Activity activity = context instanceof Activity ? (Activity) context : null;
        //mActivity = activity;
        // Check if the READ_PHONE_STATE permission is already available.
        //this.context = getActivity().getApplicationContext();

        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            // READ_PHONE_STATE permission has not been granted.
            requestPermissions();
        } else {
            // READ_PHONE_STATE permission is already been granted.
            RecordedIMEI = permissionGrantedActions();
        }
        if(RecordedIMEI != null) {
            Log.i("loadIMEIService", "IMEI number returned!");
        }
        return RecordedIMEI;
    }

这篇关于Android Studio:当headlessfragment调用时,java.lang.NullPointerException错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆