0

Я создаю навигационный ящик с тремя фрагментами.Ошибка Android: попытка вызвать виртуальный метод «void android.app.ActionBar.setDisplayHomeAsUpEnabled (boolean)» на ссылку на нулевой объект?

Это мое основное занятие.

import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentManager; 
import android.os.Bundle; 
import android.support.v4.app.ActionBarDrawerToggle; 
import android.support.v4.widget.DrawerLayout; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 

public class Main2Activity extends Activity { 

    private String[] mNavigationDrawerItemTitles; 
    private DrawerLayout mDrawerLayout; 
    private ListView mDrawerList; 

    private ActionBarDrawerToggle mDrawerToggle; 

    // nav drawer title 
    private CharSequence mDrawerTitle; 

    // used to store app title 
    private CharSequence mTitle; 

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

     // for proper titles 
     mTitle = mDrawerTitle = getTitle(); 

     // initialize properties 
     mNavigationDrawerItemTitles = getResources().getStringArray(R.array.navigation_drawer_items_array); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerList = (ListView) findViewById(R.id.left_drawer); 

     // list the drawer items 
     ObjectDrawerItem[] drawerItem = new ObjectDrawerItem[3]; 

     drawerItem[0] = new ObjectDrawerItem(R.drawable.firstaidkit, "Create"); 
     drawerItem[1] = new ObjectDrawerItem(R.drawable.flag, "Techniques"); 
     drawerItem[2] = new ObjectDrawerItem(R.drawable.charity, "Health Tips"); 

     // Pass the folderData to our ListView adapter 
     DrawerItemCustomAdapter adapter = new DrawerItemCustomAdapter(this, R.layout.listview_item_row, drawerItem); 

     // Set the adapter for the list view 
     mDrawerList.setAdapter(adapter); 

     // set the item click listener 
     mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 





     // for app icon control for nav drawer 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerToggle = new ActionBarDrawerToggle(
       this,     /* host Activity */ 
       mDrawerLayout,   /* DrawerLayout object */ 
       R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */ 
       R.string.drawer_open, /* "open drawer" description */ 
       R.string.drawer_close /* "close drawer" description */ 
     ) { 

      /** Called when a drawer has settled in a completely closed state. */ 
      public void onDrawerClosed(View view) { 
       super.onDrawerClosed(view); 
       getActionBar().setTitle(mTitle); 
      } 

      /** Called when a drawer has settled in a completely open state. */ 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       getActionBar().setTitle(mDrawerTitle); 
      } 
     }; 

     // Set the drawer toggle as the DrawerListener 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     // enable ActionBar app icon to behave as action to toggle nav drawer 
     getActionBar().setDisplayHomeAsUpEnabled(true); 
     getActionBar().setHomeButtonEnabled(true); 



     if (savedInstanceState == null) { 
      // on first time display view for first nav item 
      selectItem(0); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     // The action bar home/up action should open or close the drawer. 
     // ActionBarDrawerToggle will take care of this. 
     if (mDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    // to change up caret 
    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     mDrawerToggle.syncState(); 
    } 


    // navigation drawer click listener 
    private class DrawerItemClickListener implements ListView.OnItemClickListener { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      selectItem(position); 
     } 

    } 

    private void selectItem(int position) { 

     // update the main content by replacing fragments 

     Fragment fragment = null; 

     switch (position) { 
      case 0: 
       fragment = new CreateFragment(); 
       break; 
      case 1: 
       fragment = new ReadFragment(); 
       break; 
      case 2: 
       fragment = new HelpFragment(); 
       break; 

      default: 
       break; 
     } 

     if (fragment != null) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); 

      // update selected item and title, then close the drawer 
      mDrawerList.setItemChecked(position, true); 
      mDrawerList.setSelection(position); 
      setTitle(mNavigationDrawerItemTitles[position]); 
      mDrawerLayout.closeDrawer(mDrawerList); 

     } else { 
      // error in creating fragment 
      Log.e("MainActivity", "Error in creating fragment"); 
     } 
    } 

    @Override 
    public void setTitle(CharSequence title) { 
     mTitle = title; 
     getActionBar().setTitle(mTitle); 
    } 
    } 

Это файл XML

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 

     <ListView 
      android:id="@+id/left_drawer" 
      android:layout_width="240dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="left|top" 
      android:choiceMode="singleChoice" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="0dp" 
      android:background="#111"/> 
    </FrameLayout> 

</android.suport.v4.widget.DrawerLayout> 

И это мой styles.xml файл

<resources> 

    <!-- 
     Base application theme, dependent on API level. This theme is replaced 
     by AppBaseTheme from res/values-vXX/styles.xml on newer devices. 
    --> 
    <style name="AppBaseTheme" parent="android:Theme.Light"> 
     <!-- 
      Theme customizations available in newer API levels can go in 
      res/values-vXX/styles.xml, while customizations related to 
      backward-compatibility can go here. 
     --> 
    </style> 

    <!-- Application theme. --> 
    <style name="AppTheme" parent="AppBaseTheme"> 
     <!-- All customizations that are NOT specific to a particular API-level can go here. --> 
    </style> 

</resources> 

Но это не показывает эту ошибку, независимо от того, что я делаю: Попытка вызова виртуальной метод 'void android.app.ActionBar.setDisplayHomeAsUpEnabled (boolean)' на нулевой ссылке объекта

I'v e изменил тему с AppCompatTheme на AppBaseTheme, поскольку это было общее решение, когда я искал эту ошибку. Но, похоже, это не работает.

ответ

1

Эта ошибка возникает из-за того, что вы применили операцию над представлением и которая недоступна в вашем соответствующем XML-файле. Если вы проверите все представления в xml-файлах. На самом деле вы получаете нулевым из файла style.xml просто это нравится,

<style name="MyCustomTheme" parent="@android:style/Theme.Holo.Light"> 
     <item name="android:actionBarStyle">@style/MyActionBarTheme</item> 
    </style> 

    <style name="MyActionBarTheme" parent="@android:style/Widget.Holo.Light.ActionBar"> 
     <item name="android:background">ANY_HEX_COLOR_CODE</item> 
    </style> 

И импортировать этот стиль в файле манифеста, он будет решить вашу проблему.

+0

спасибо за ответ. Я сделал эти изменения и дал мне эту ошибку в файле значений-v21 \ values-v21.xml Ошибка: (3) Ошибка получения родительского элемента для элемента: ресурс не найден, который соответствует указанному имени «AppTheme». – Nivedita

Смежные вопросы

 Смежные вопросы