我有问题!
为什么当我尝试获取屏幕方向时,我的应用程序会收到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
}
我正在使用片段。 请帮助我!
答案 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);
}
}