Android

[안드로이드]Toast사용시 Caused by java.lang.NullPointerException: Attempt to invoke virtual method ‘android.view.View android.view.View.findViewById(int)’ on a null object reference 오류 발생 해결하기

앱 업그레이드 후 마켓에 등록하였는데, 다음날 메일이 하나 왔다. 급속도로 오류가 발생하고 있다는 오류보고서였다.

Firebase 콘솔에 로그인 후 오류 내용을 확인하였다. 안드로이드 11 운영체제를 사용하는 폰에서 62명의 사용자로부터 비정상 종료 이벤트가 발생되었다.


이번 업데이트 구글플레이 스토어의 앞으로 변경될 정책 중에 앱 타이틀명이 30글자 이상 초과할 수 없다. 나중에 앱 삭제 방지를 위해 미리 처리하고 앱 내에 타이틀도 동일하게 글자수를 줄인 후 마켓에 올리는 과정에 2021년 11월부터 앱등록시  targetSdkVersion을 30 이상으로 해야 가능함으로 targetSdkVersion와 compileSdkVersion 을 30으로 처리 후 마켓에 등록한 이후부터 발생된 오류이다.

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'
android {
    compileSdkVersion 30
    defaultConfig {
        applicationId "smart.app.sample.mobile."
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 8
        versionName "7.0.8"
        vectorDrawables.useSupportLibrary = true   //벡터이미지 사용 유무를 설정
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    
    ..............생략
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
       at smart.app.mobile.GeneralActivity.CautionToast(GeneralActivity.java:1)
       at android.app.Activity.dispatchActivityResult(Activity.java:8550)
       at android.app.ActivityThread.deliverResults(ActivityThread.java:5572)
       at android.app.ActivityThread.handleSendResult(ActivityThread.java:5620)
       at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:246)
       at android.app.ActivityThread.main(ActivityThread.java:8633)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

안드로이드 버전을 targetSdkVersion 30으로 지정한 후 부터 안드로이드 11 운영체제를 사용하는 휴대폰에서는 Toast 메세지에 대한 커스터마이징 처리가 불가능하다.

오류가 발생한 토스트 메시지 코드는 다음과 같다. 

Toast 메세지 글씨 색상을 변경하기 위해 findViewById로 messaage 객체에 접근하였으나 찾지 못하는 오류가 발생되고, 

setGravity()역시 접근할 수 없게 되었다.

    private void CautionToast(){
        Toast toast = Toast.makeText(GeneralActivity.this, getResources().getString(R.string.d_1), Toast.LENGTH_LONG);
        toast.setGravity(Gravity.CENTER, 0, 0);

        View view = toast.getView();
        //view.getBackground().setColorFilter(getResources().getColor(R.color.dot_dark_screen1), PorterDuff.Mode.SRC_IN);

        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // 안드로이드 10,Q, 29) (Version9, Pie, 28)
                view.getBackground().setColorFilter(new BlendModeColorFilter(ContextCompat.getColor(this, R.color.dot_dark_screen1), BlendMode.SRC_ATOP));
            } else {
                view.getBackground().setColorFilter(getResources().getColor(R.color.dot_dark_screen1), PorterDuff.Mode.SRC_IN);
            }
        }catch (Exception e){

        }

        TextView text = view.findViewById(android.R.id.message);
        text.setTextColor(getResources().getColor(R.color.colorxml_color_41));

        toast.show();
    }

 

오류 해결방법은 기본 토스트메세지를 사용하는 것이다.

Toast.makeText(GeneralActivity.this
, getResources().getString(R.string.d_1), Toast.LENGTH_LONG).show();

 

Leave a Reply

error: Content is protected !!