我有一个问题!
为什么当我尝试获取屏幕方向时,我的应用程序会获得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
}
我正在使用碎片。请帮助我!
如果要在onCreate()中调用函数getOrientation(),请转到onResume()和Check。这可能有所帮助
如果您正在尝试使用context
中的Fragment
,我建议您创建此
private val mContext by lazy {
[email protected]
}
然后在你的方法getOrientation()
只使用mContext
而不是。
如果您不想在lazy
中使用onCreateView()
,请添加此项
activity = activity as Context
然后你可以使用你的activity
作为context
只有当您知道需要一个上下文来生成可能比您拥有的任何其他可能的上下文更长的内容时,才使用getApplicationContext()。场景包括:
如果需要绑定到本身具有全局范围的Context的东西,请使用getApplicationContext()。我使用getApplicationContext(),例如,在WakefulIntentService中,用于服务的静态WakeLock。由于WakeLock是静态的,并且我需要一个Context来获取PowerManager来创建它,因此使用getApplicationContext()是最安全的。
如果希望通过onRetainNonConfigurationInstance()传递Activity实例之间的ServiceConnection(即绑定句柄),则在从Activity绑定到Service时使用getApplicationContext()。 Android通过这些ServiceConnections在内部跟踪绑定,并保存对创建绑定的上下文的引用。如果从Activity绑定,则新的Activity实例将具有对ServiceConnection的引用,该引用具有对旧Activity的隐式引用,并且旧Activity不能被垃圾回收。
如果您想获得当前的方向,那么您可以使用:
Activity.getResources()。getConfiguration()。方向
请使用以下内容,而不是使用应用程序上下文调用
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if( (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE))
{ mainBinding.layoutDrawerView.openDrawer(GravityCompat.END);
}
}