当我尝试获取屏幕方向时出现NullPointerException

时间:2019-04-17 10:53:52

标签: android nullpointerexception screen orientation

我有问题!

为什么当我尝试获取屏幕方向时,我的应用程序会收到NullPointerException。

日志:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
    at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:106)
    at adrian.bjd.masterdetail_myapp.MainActivity.getOrientation(MainActivity.kt:25)
    at adrian.bjd.masterdetail_myapp.MainActivity.onClickItem(MainActivity.kt:43)
    at adrian.bjd.masterdetail_myapp.Fragment.MenuFragment.onItemClick(MenuFragment.kt:46)
    at android.widget.AdapterView.performItemClick(AdapterView.java:339)
    at android.widget.AbsListView.performItemClick(AbsListView.java:1705)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:4171)
    at android.widget.AbsListView$13.run(AbsListView.java:6734)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6682)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

我的代码:

fun getOrientation(): Int
{
    val context = applicationContext
    var orientation = 0

    if(context.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        orientation = 1
    }
    else if(context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        orientation = 2
    }

    return orientation
}

我正在使用片段。 请帮助我!

3 个答案:

答案 0 :(得分:1)

如果要在onCreate()中调用函数 getOrientation(),请移至onResume()并检查。这可能有帮助

答案 1 :(得分:0)

如果您尝试使用context中的Fragment,我建议您创建此

private val mContext by lazy {
    this@YourFragment.context
}

然后在方法getOrientation()中使用mContext代替。

如果您不想在lazy中使用onCreateView(),请添加

activity = activity as Context

然后您可以将activity用作context

答案 2 :(得分:-1)

仅当您知道需要某种上下文的东西才可以使用,而这些东西的寿命可能比您拥有的其他任何可能的上下文更长,则仅使用getApplicationContext()。场景包括:

如果需要与本身具有全局作用域的Context相关联的内容,请使用getApplicationContext()。例如,在WakefulIntentService中,我使用getApplicationContext()将静态WakeLock用于服务。由于该WakeLock是静态的,并且我需要在PowerManager处创建上下文才能使用它,因此使用getApplicationContext()是最安全的。

如果您希望通过onRetainNonConfigurationInstance()在Activity实例之间传递ServiceConnection(即绑定的句柄),则从Activity绑定到Service时,请使用getApplicationContext()。 Android通过这些ServiceConnection在内部跟踪绑定,并保留对创建绑定的Context的引用。如果从Activity进行绑定,则新的Activity实例将具有对ServiceConnection的引用,该ServiceConnection隐含了对旧Activity的引用,并且不能对旧的Activity进行垃圾回收。

如果要获取当前方向,则可以使用:

Activity.getResources()。getConfiguration()。orientation

与其在应用程序上下文中调用,不如在下面使用

@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if( (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE))
    {                    mainBinding.layoutDrawerView.openDrawer(GravityCompat.END);
    }
}