Programing

getActionBar 메소드를 수정하는 방법은 java.lang.NullPointerException을 생성 할 수 있습니다.

lottogame 2020. 10. 26. 07:39
반응형

getActionBar 메소드를 수정하는 방법은 java.lang.NullPointerException을 생성 할 수 있습니다.


활동에서 내 작업 표시 줄로 도구 모음을 사용하고 있습니다. getActionBar().setDisplayHomeAsUpEnabled(true);이전 장치의 Up 탐색을 위해 Activity.java 파일에 메서드를 추가하려고 합니다.

이 메서드는 Android 스튜디오에서 다음 오류 메시지를 생성합니다.

메소드 호출은 java.lang.NullPointerException을 생성 할 수 있습니다.

도구 모음의 위쪽 탐색은 최신 장치에서 잘 작동합니다 ... 이제 이전 장치에서 작동하는지 확인하는 방법을 알아 내려고합니다. 조언하십시오.

build.gradle에서 :

dependencies {
   compile "com.android.support:appcompat-v7:22.1.0"
}

AndroidManifest.xml에서 :

android:theme="@style/Theme.AppCompat.NoActionBar.FullScreen" 

styles.xml에서

<style name="Theme.AppCompat.NoActionBar.FullScreen" parent="AppTheme">
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>

Activity.java에서

public class CardViewActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.cardviewinput);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    if (toolbar != null) {
        // Up navigation to the parent activity for 4.0 and earlier
        getActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationIcon(R.drawable.ic_action_previous_item);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }

}

실제로 Android Studio는 "오류 메시지"를 표시하지 않고 단지 경고 일뿐입니다.

일부 답변은 어설 션 사용을 제안합니다. Dalvik 런타임에는 기본적으로 어설 션 이 꺼져 있으므로 실제로 뭔가를 수행하려면 실제로 켜야합니다. 이 경우 (어설 션이 꺼져 있음) 기본적으로 수행하는 작업은 경고를 표시하지 않도록 Android Studio를 속이는 것입니다. 또한 프로덕션 코드에서 "assert"를 사용하지 않는 것을 선호합니다.

제 생각에는 당신이해야 할 일은 매우 간단합니다.

if(getActionBar() != null){
   getActionBar().setDisplayHomeAsUpEnabled(true);
}

업데이트 : Action Bar의 지원 라이브러리 버전을 사용하는 경우 getActionBar ()를 getSupportActionBar ()로 대체해야합니다.

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

먼저 툴바를 지원 ActionBar로 설정해야합니다. 그런 다음 항상 거기에있을 것이라고 확신하면! = null로 주장하십시오. 이것은 컴파일러에게 null이 아니라고 알려주므로 null 검사가 통과됩니다.

@Override
protected void onCreate(Bundle savedInstanceState)
{
   super.onCreate(savedInstanceState);
   setContentView(R.layout.cardviewinput);

   Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
   setSupportActionBar(toolbar);

   assert getSupportActionBar() != null;
   getSupportActionBar().setDisplayHomeAsUpEnabled(true); // it's getSupportActionBar() if you're using AppCompatActivity, not getActionBar()
}

Thank You Andrew for your answer. If you have a Nav Drawer or something else that uses getSupportActionBar() you need to add assert getSupportActionBar() != null;

Peace,

Example:

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    assert getSupportActionBar() != null;
    getSupportActionBar().setTitle(mTitle);
}

Try this :

private ActionBar getActionBar() {
    return ((AppCompatActivity) getActivity()).getSupportActionBar();
}

What I have done is override the getSupportActionBar() method in my base Activity and add a @NonNull annotation. This way, I only get one lint warning in the base activity about how I use @NonNull annotation for something that has a @Nullable annotation.

    @NonNull
    @Override
    public ActionBar getSupportActionBar() {
        // Small hack here so that Lint does not warn me in every single activity about null
        // action bar
        return super.getSupportActionBar();
    }

I created a generic class such as:

public final class Cast
{
    private Cast() {}

    /**
     * Helps to eliminate annoying NullPointerException lint warning.
     */
    @android.support.annotation.NonNull
    public static <T> T neverNull(T value)
    {
        return value;
    }
}

then I can use it for any call with NullPointerException warning for which I am sure that it will never happen, e.g.

final ActionBar actionBar = Cast.neverNull(getSupportActionBar());
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);

P.S. don't forget to add "com.android.support:support-annotations" to your gradle file.


add assert getSupportActionBar() != null; before getSupportActionBar().setDisplayHomeAsUpEnabled(true);


 if(actionBar != null) {
  actionBar.setHomeButtonEnabled(true);
  actionBar.setBackgroundDrawable(ContextCompat.getDrawable(mContext,
                                  R.drawable.action_bar_gradient));
 }

use this theme: android:theme="@style/Theme.AppCompat.Light.NoActionBar"

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Title");
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_action_previous_item);
actionBar.setDisplayHomeAsUpEnabled(true);

Alternatively you could assert actionbar to not null.Add the assertion before calling your actionbar as follows

assert getSupportActionBar() != null;

Final snippet would therefore look as follows:

    setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
    assert getSupportActionBar() != null;
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Try this :

setSupportActionBar (toolbar);
if(getSupportActionBar () != null) {
assert getSupportActionBar () != null;
getSupportActionBar ().setDisplayHomeUpEnabled(true);
}

Note that setSupportActionBar(toolbar) should be before getSupportActionBar().


  if(getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
    OR

Replace the MainActivity extends AppCompatActivity to public class MainActivity extends AppCompatActivity


just check getSupportActionBar not equal to null

    setSupportActionBar(toolbar);

    if(getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Daily Shopping List");
    }

If you are importing

android.app.ActionBar 

you have to use getActionBar()

and if you are importing

android.support.v7.app.ActionBar

use getSupportActionBar()

참고URL : https://stackoverflow.com/questions/29786011/how-to-fix-getactionbar-method-may-produce-java-lang-nullpointerexception

반응형