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()
'Programing' 카테고리의 다른 글
UIView 블록 기반 애니메이션을 취소하는 방법은 무엇입니까? (0) | 2020.10.26 |
---|---|
firefox overflow-y가 중첩 된 flexbox에서 작동하지 않습니다. (0) | 2020.10.26 |
node_modules를 제외하지 않는 Webpack (0) | 2020.10.26 |
_CRT_SECURE_NO_DEPRECATE를 통해 생성 된 경고 비활성화 (0) | 2020.10.26 |
MySQL에서 인덱스 크기를 알아내는 방법 (0) | 2020.10.26 |