2014-10-31 2 views
2

У меня возникли проблемы с закрытием Layer Layout в Android. Каждый раз, когда я вызываю drawer.closeDrawers() или drawer.closeDrawers (list), я запускаю исключение Null Pointer.Android - Layer Layout - Закрытие ящиков вызывает исключение Null Pointer

Вот мой код MainActivity.java.

// Sliding drawer menu 
private DrawerLayout drawer; 
// Drawer list 
private ListView drawerList; 
... 
... 
... 
// List of menu options 
final String[] menu = new String[]{ 
     "Item 1", 
     "Item 2", 
     "Item 3", 
     "Item 4", 
     "Item 5" 
}; 
// Initialize the drawer menu layout 
drawer = (DrawerLayout) findViewById(R.layout.activity_main); 
// Initialize the drawer list 
drawerList = (ListView) findViewById(R.id.list_slidermenu); 
// Drawer list adapter 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, menu); 
// Set the adapter for the list 
drawerList.setAdapter(adapter); 
// Set the background selector for each menu item 
drawerList.setSelector(android.R.color.holo_blue_dark); 
// On click listener for the list 
drawerList.setOnItemClickListener(new OnItemClickListener() { 
    // When a menu item is clicked 
    public void onItemClick(AdapterView<?> e, View v, int position, long id) { 
     // Close the drawer 
     drawer.closeDrawers(); // Causes a Null Pointer Exception 
    } 
}); 

Это мой код activity_main.xml.

<!-- Left sided swipe in Drawer layout --> 
<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 to display Fragments --> 
<FrameLayout 
    android:id="@+id/frame_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <!-- Google maps fragment --> 
    <fragment 
     android:id="@+id/google_map" 
     android:name="com.google.android.gms.maps.MapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
    </fragment> 
</FrameLayout> 

<!-- Listview to display slider menu --> 
<ListView 
    android:id="@+id/list_slidermenu" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:choiceMode="singleChoice" 
    android:divider="@android:color/transparent" 
    android:dividerHeight="0dp" 
    android:background="#F0F0F0"/> 

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

Вот моя трассировка стека ошибок.

10-30 20:29:21.956: E/AndroidRuntime(1959): FATAL EXCEPTION: main 
10-30 20:29:21.956: E/AndroidRuntime(1959): Process: com.dziz.umbcparkingpal, PID: 1959 
10-30 20:29:21.956: E/AndroidRuntime(1959): java.lang.NullPointerException 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at com.dziz.umbcparkingpal.MainActivity$1.onItemClick(MainActivity.java:108) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at android.widget.AdapterView.performItemClick(AdapterView.java:301) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at android.widget.AbsListView.performItemClick(AbsListView.java:1113) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at android.widget.AbsListView$3.run(AbsListView.java:3645) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at android.os.Handler.handleCallback(Handler.java:733) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at android.os.Handler.dispatchMessage(Handler.java:95) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at android.os.Looper.loop(Looper.java:136) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at android.app.ActivityThread.main(ActivityThread.java:5097) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at java.lang.reflect.Method.invoke(Method.java:515) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
10-30 20:29:21.956: E/AndroidRuntime(1959):  at dalvik.system.NativeStart.main(Native Method) 

Может ли кто-нибудь сказать мне, что я делаю, чтобы вызвать это исключение нулевого указателя?

ответ

1

Установите кассеты с,

drawer= (DrawerLayout) findViewById(R.id.DrawerLayout); 
0

Вы должны раздуть макет перед извлечением точку внутри него:

LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) 
View drawer = inflater.inflate(R.layout.activity_main, null); 

, то вы можете получить мнения:

drawerList = (ListView) drawer.findViewById(R.id.list_slidermenu); 
+0

Это не сработало. Android столкнулся с ошибкой, пытаясь раздуть представление. Кроме того, вы не очень точно относились к тому, что я должен делать с раздутым представлением, он просто висит там неиспользуемым. –

+0

«Вид» - ваш «ящик» – habitats

+0

Да, я попробовал инициализировать мой DrawerLayout с завышенным видом с помощью броска.Это не помогло, оно только разбило программу на старте. –

0

Я была такая же проблема и решить ее, вызвав этим :

DrawerLayout drawerLayout = (DrawerLayout) ((MainActivity) getActivity()).findViewById(R.id.drawer_layout); 
drawerLayout.closeDrawers(); 

внутри фрагмента. Где MainActivity - это действие, в которое вы помещаете drawer_layout.

Также убедитесь, что вы получили ссылку на drawerLayout прямо перед вызовом closeDrawers(), поскольку в моем случае у меня все еще есть NullPointer при вызове findViewById() в начале onCreateView() моего фрагмента.

Так что в вашем случае вызовите findViewById() из вашего метода onItemClicked().

Надеюсь, это поможет.

0

У меня есть использовать ящик, и это прекрасно работать с любой ошибкой. Это часть моего кода. Я думаю, это может помочь вам.

HomeActivity.java

public class HomeActivity extends Activity { 
    DrawerLayout mDrawerLayout; 
    ListView mDrawerList; 
    private String[] navMenuTitles; 
    private TypedArray navMenuIcons; 
    private ArrayList<NavDrawerItem> navDrawerItems; 
    private NavDrawerListAdapter adapter; 


    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      Log.d("Activity :", getClass().getName().toString()); 

      initDrawer(savedInstanceState); 

    } 

    private void initDrawer(Bundle savedInstanceState) { 
      mTitle = mDrawerTitle = getTitle(); 

      navMenuTitles = getResources().getStringArray(
        R.array.student_nav_drawer_items); 
      navMenuIcons = getResources().obtainTypedArray(
        R.array.student_nav_drawer_icons); 

      mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
      mDrawerList = (ListView) findViewById(R.id.left_drawer); 

      navDrawerItems = new ArrayList<NavDrawerItem>(); 


      mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

      adapter = new NavDrawerListAdapter(getApplicationContext(), 
        navDrawerItems); 
      mDrawerList.setAdapter(adapter); 

      getActionBar().setDisplayHomeAsUpEnabled(true); 
      getActionBar().setHomeButtonEnabled(true); 
      getActionBar().setIcon(android.R.color.transparent); 
      getActionBar().setDisplayShowCustomEnabled(true); 
      getActionBar().setCustomView(R.layout.custom_titlebar); 

      tvTitle = (TextView) findViewById(R.id.tv_title); 
      tvTitle.setText(getString(R.string.title_activity_home)); 

      mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
        R.drawable.slider_icon, R.string.app_name, R.string.app_name 

      ) { 
       public void onDrawerClosed(View view) { 
        getActionBar().setTitle(mTitle); 
        invalidateOptionsMenu(); 
       } 

       public void onDrawerOpened(View drawerView) { 
        getActionBar().setTitle(mDrawerTitle); 
        invalidateOptionsMenu(); 
       } 
      }; 
      mDrawerLayout.setDrawerListener(mDrawerToggle); 

      if (savedInstanceState == null) { 
       selectItem(0); 

      } 
     } 

private void selectItem(int position) { 

     switch (position) { 
     case 0: 

      break; 
     case 1: 

      break; 
     case 2: 

      break; 

     case 3: 


      break; 
     default: 


      break; 
     } 

     mDrawerLayout.closeDrawer(mDrawerList); 
    } 

activity_main.xml

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

    <RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
    </RelativeLayout> 

    <!-- The navigation drawer --> 

    <ListView 
     android:id="@+id/left_drawer" 
     android:layout_width="250dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="#FFFFFF" 
     android:choiceMode="singleChoice" 
     android:divider="#444" 
     android:dividerHeight="1dp" 
     android:minHeight="?android:attr/listPreferredItemHeightSmall" 
     android:textAppearance="?android:attr/textAppearanceListItemSmall" /> 

</android.support.v4.widget.DrawerLayout> 
0

, если (mDrawerLayout.isDrawerOpen (mRecyclerDrawer)) { mDrawerLayout.closeDrawer (ListView); } else { mDrawerLayout.openDrawer (listview); }

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