Ошибка Android [попытка вызвать виртуальный метод void android.app.ActionBar 'в ссылке на нулевой объект]
У меня есть модуль кода, который реализует viewpager с ящиком навигации, однако, когда я запускаю код, я получаю следующую ошибку
01-26 09:20:02.958: D/AndroidRuntime(18779): Shutting down VM
01-26 09:20:02.959: E/AndroidRuntime(18779): FATAL EXCEPTION: main
01-26 09:20:02.959: E/AndroidRuntime(18779): Process: com.example.tabwithslidingdrawer, PID: 18779
01-26 09:20:02.959: E/AndroidRuntime(18779): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tabwithslidingdrawer/com.example.tabwithslidingdrawer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread.access$800(ActivityThread.java:148)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.os.Handler.dispatchMessage(Handler.java:102)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.os.Looper.loop(Looper.java:135)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread.main(ActivityThread.java:5312)
01-26 09:20:02.959: E/AndroidRuntime(18779): at java.lang.reflect.Method.invoke(Native Method)
01-26 09:20:02.959: E/AndroidRuntime(18779): at java.lang.reflect.Method.invoke(Method.java:372)
01-26 09:20:02.959: E/AndroidRuntime(18779): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
01-26 09:20:02.959: E/AndroidRuntime(18779): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
01-26 09:20:02.959: E/AndroidRuntime(18779): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779): at com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.Activity.performCreate(Activity.java:5953)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
01-26 09:20:02.959: E/AndroidRuntime(18779): ... 10 more
09:20:02.959: E/AndroidRuntime(18779): Caused by:
java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null
object reference 01-26 09:20:02.959: E/AndroidRuntime(18779): at
com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
указывает на эту линию
// enabling action bar app icon and behaving it as a toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
весь код http://pastebin.com/u1K72fr7
Мой манифест
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tabwithslidingdrawer"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Tabwithpager" >
<activity
android:name="com.example.tabwithslidingdrawer.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Android: тема = "@стиль/Theme.Tabwithpager"
код http://pastebin.com/EFQLzRej
================================================== ================ РЕДАКТИРОВАТЬ/ОБНОВИТЬ:
Что я узнал из этого
Всякий раз, когда возникает такая ошибка
1. Проверьте, какой тип действия используется, это простое действие android.app или AppCompatActivity или ActionBarActivity и т.д.
2. Проверьте, относится ли ваш расширенный вид деятельности к категории соответствия.
Пример. Activity/Fragment на основе android.app не относится к типу appCompat, тогда как android.support.v4.app.Fragment или android.support.v4.app.ActivityCompat основаны на appCompat.
если он попадает в appCompat, мы используем getSupportActionBar(), иначе для типов android.app мы можем использовать getActionBar()
3. Проверьте тему, примененную к рассматриваемой деятельности, в файле манифеста.
пример: в файле манифеста, если применяется тема, скажем, android: theme = "@android: style/Theme.Holo.Dialog", getActionBar() будет работать
но если тема, применяемая для действия в манифесте, выглядит следующим образом: android: theme = "@style/Theme.AppCompat.Light", тогда вы должны использовать getSupportActionBar()
Ответы
Ответ 1
Ваш код набрасывает com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
:
// enabling action bar app icon and behaving it as toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
Проблема довольно проста: ваш Activity
наследуется от нового android.support.v7.app.ActionBarActivity
. Вы должны использовать вызов getSupportActionBar()
вместо getActionBar()
.
Если вы посмотрите выше строки 65 вашего кода, вы увидите, что вы уже это делаете:
actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
// TODO: Remove the redundant calls to getSupportActionBar()
// and use variable actionBar instead
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
И затем опуститесь ниже линии 87, похоже, вы выяснили то же самое:
getSupportActionBar().setTitle(
Html.fromHtml("<font color=\"black\">" + mTitle + " - "
+ menutitles[0] + "</font>"));
// getActionBar().setTitle(mTitle +menutitles[0]);
Обратите внимание, как вы прокомментировали getActionBar()
.
Ответ 2
Если кто-то хочет использовать android.app.ActionBar и android.app.Activity, вы должны изменить тему приложения в styles.xml, например:
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
Проблема в том, что вы можете использовать тему AppCompat.
С другой стороны, если вы хотите использовать android.support.v7.app.ActionBar и расширяете свою активность с помощью AppCompatActivity, вы должны использовать тему AppCompat, чтобы избежать этой проблемы, например:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
Надеюсь это поможет.
Ответ 3
когда вы расширяете appcompatActivity, затем используйте
this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
и когда вы расширяете ActionBar, используйте
this.getActionBar().setDisplayHomeAsUpEnabled(true);
Не забудьте вызвать эту функцию в oncreate после инициализации панели инструментов/панели действий
Ответ 4
Я думаю, что вы хотите сделать, это cast getActivity(). Например:
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Это то, что вам нужно сделать с новыми библиотеками поддержки. AppCompatActivity заменил ActionBarActivity.
Ответ 5
Попробуйте проверить здесь
res → значения → styles.xml
убедитесь, что нет такого кода, как этот
<item name="windowActionBar">false</item>
Если есть такой код, вы можете временно отключить его или стереть его
Ответ 6
Кнопка "Вверх" обычно активируется для действий низкого уровня. В вашем манифесте я вижу только MainActivity.
Я не думаю, что имеет смысл активировать кнопку "вверх" для основного действия.
Создайте действие, затем в манифесте добавьте атрибут parentActivityName.
Затем активируйте кнопку "вверх" в режиме onCreate.
Это должно помочь.
https://developer.android.com/training/appbar/up-action.html
Ответ 7
В моем случае у меня была такая же ошибка, но моя ошибка заключалась в том, что я не объявлял свою панель инструментов.
Итак, прежде чем использовать getSupportActionBar, мне пришлось найти свою панель инструментов и установить actionBar
appbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(appbar);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Ответ 8
При использовании AppCompatActivity необходимо вызывать
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Перед getSupportActionBar()
public class PageActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_item);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
this.getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
}
Ответ 9
Для всех, у кого есть BaseActivity, и дочерний элемент, который простирается от него, убедитесь, что super.onCreate() вызывается первым, прежде чем что-либо делать. Старая активность будет работать, если впоследствии вы вызовете super.onCreate().
Child extends Activity - может вызвать super после того, как вы сделали материал
@Override
protected void onCreate(Bundle savedInstanceState)
{
getActionBar().setDisplayHomeAsUpEnabled(true);
super.onCreate(savedInstanceState);
Ребенок расширяет AppCompatActivity - я должен сначала вызвать супер
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState); //do this first
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Ответ 10
Если вы используете android.app.ActionBar и android.app.Activity, вы должны изменить тему приложения в теге приложения:
< Приложение
Android: тема = "@андроид: стиль /Theme.Holo.Light" >
Ответ 11
в этой строке в вашей деятельности:
super.onCreate(savedInstanceState);
setContentView(R.layout.Activity_Main);
используйте это:
super.onCreate(savedInstanceState);
setContentView(R.layout.*);
*
- ваша деятельность
Ответ 12
В моем случае из-за styles.xml
установить неправильную родительскую тему, т.е. NoActionBar
тема, конечно getSupportActionbar()
равна null:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
Изменено это на что-то еще исправленное:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
Ответ 13
Для тех, кто все еще имеет эту проблему, моя проблема была решена в файле AndroidManifest.xml. Где он говорит <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">
, вам нужно удалить NoActionBar
, сделав его <activity android:name=".MainActivity" android:theme="@style/AppTheme">
, потому что при установке NoActionBar приложение не знает, хочет ли он панель действий, когда вы вызываете ее внутри MainActivity.java
Ответ 14
Однажды я получил ту же ошибку, я создал шаблон для панели инструментов по умолчанию (toolbar.xml), а затем в другом представлении я создал складную панель инструментов.
Мне потребовалось добавить свернутую панель инструментов в представление, которое отображает некоторую информацию о пользователе (например, whatsapp), но метод findViewById ссылался на панель инструментов по умолчанию (панель инструментов id), а не на свернутую (также панель инструментов id), да, я написал один и тот же идентификатор для обеих панелей инструментов, поэтому, когда я пытался получить доступ к активности, приложение зависало, показывая мне ошибку.
Я исправил ошибку, изменив идентификатор сворачиваемой панели инструментов на id: col_toolbar, и ошибка исчезла, и мое приложение работало отлично
Ответ 15
Я знаю, что этот вопрос - что-то старое. Но это может помочь многим, кто представляет эту проблему.
Чтобы решить эту проблему, проверьте, есть ли точка недействительности. Затем примените соответствующую конфигурацию:
if(getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
Ответ 16
Вы должны попробовать это. Я думаю, что это будет работать.
Toolbar toolbar = findViewById(R.id.toolbar1);
setSupportActionBar(toolbar);
mDrawerLayout = findViewById(R.id.drawer_layout);
mDrawerLayout = findViewById(R.id.drawer_layout);
mDrawerLayout.setDrawerShadow(R.drawable.rectagle_with_black_outer,
GravityCompat.START);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
toolbar, R.string.navigation_drawer_close,
R.string.navigation_drawer_close) {
public void onDrawerClosed(View view) {
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
invalidateOptionsMenu();
}
};
Ответ 17
Лучшее решение сделать это в вашем методе Oncreate
ActionBar actionBar = getSupportActionBar();
if(actionBar != null){
actionBar.setDisplayHomeAsUpEnabled(true);
}
с последующим новым классом
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == android.R.id.home){
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
Ответ 18
Попробуйте сделать это:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
Вместо этого:
actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);