NullPointerException при попытке получить ориентацию экрана - PullRequest
0 голосов
/ 17 апреля 2019

У меня проблема!

Почему, когда я пытаюсь получить ориентацию экрана, мое приложение получает исключение 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 ]

1 голос
/ 17 апреля 2019

Если вы вызываете свою функцию getOrientation () в onCreate () перейдите к onResume () и проверьте. это может помочь

0 голосов
/ 17 апреля 2019

Вы используете getApplicationContext () только тогда, когда знаете, что вам нужен контекст для чего-то, что может жить дольше, чем любой другой вероятный контекст, который у вас есть.Сценарии включают:

Используйте getApplicationContext (), если вам нужно что-то привязать к контексту, который сам по себе будет иметь глобальную область видимости.Я использую getApplicationContext (), например, в WakefulIntentService, для статического WakeLock, который будет использоваться для службы.Поскольку этот WakeLock является статическим, и мне нужен контекст, чтобы получить его в PowerManager для его создания, безопаснее всего использовать getApplicationContext ().

Использовать getApplicationContext () при привязке к Сервису из Activity, если выхотите передать ServiceConnection (т. е. дескриптор привязки) между экземплярами Activity через onRetainNonConfigurationInstance ().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);
    }
}
0 голосов
/ 17 апреля 2019

Если вы пытаетесь использовать context из вашего Fragment, я рекомендую вам создать этот

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

А затем в вашем методе getOrientation() просто используйте mContext вместо.

Если вы не хотите использовать lazy в вашем onCreateView(), добавьте это

activity = activity as Context

И тогда вы можете использовать свой activity как context

...