2014-02-21 3 views
18

Я изо всех сил пытаюсь получить элементы навигационного ящика для регистрации и запуска и намерения для нового действия. Ящик открывается нормально и отображается правильно, но ничего не происходит, когда я нажимаю на элементы в списке. Вот мой код, взятый из учебных пособий Google.Навигационный ящик Элементы, не регистрирующие событие клика

mTitle = mDrawerTitle = getTitle(); 
      mTitles = getResources().getStringArray(R.array.menu_items); 
      mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
      mDrawerList = (ListView) findViewById(R.id.left_drawer); 

      // set a custom shadow that overlays the main content when the drawer opens 
      mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 
      // set up the drawer's list view with items and click listener 
      mDrawerList.setAdapter(new ArrayAdapter<String>(this, 
        R.layout.drawer_list_item, mTitles)); 
      mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

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

      // ActionBarDrawerToggle ties together the the proper interactions 
      // between the sliding drawer and the action bar app icon 
      mDrawerToggle = new ActionBarDrawerToggle(
        this,     /* host Activity */ 
        mDrawerLayout,   /* DrawerLayout object */ 
        R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ 
        R.string.drawer_open, /* "open drawer" description for accessibility */ 
        R.string.drawer_close /* "close drawer" description for accessibility */ 
        ) { 
       public void onDrawerClosed(View view) { 
        getActionBar().setTitle(mTitle); 
        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
       } 

       public void onDrawerOpened(View drawerView) { 
        getActionBar().setTitle(mDrawerTitle); 
        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
       } 
      }; 
      mDrawerLayout.setDrawerListener(mDrawerToggle); 

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


     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.menu.main, menu); 
      return super.onCreateOptionsMenu(menu); 
     } 

     /* Called whenever we call invalidateOptionsMenu() */ 
     @Override 
     public boolean onPrepareOptionsMenu(Menu menu) { 
      // If the nav drawer is open, hide action items related to the content view 
      boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
     // menu.findItem(R.id.action_websearch).setVisible(!drawerOpen); 
      return super.onPrepareOptionsMenu(menu); 
     } 

     @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);  
      } 


     /* The click listner for ListView in the navigation drawer */ 
     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) { 
      switch (position) { 
      case 1: 
       new DataTask(MainActivity.this).execute(); 
       MainActivity.this.finish();//Set this Activity to Finish so no loop back  
       Intent intent=new Intent(MainActivity.this,SplashScreen.class); 
       startActivity(intent); 
       break; 
      case 2: 
       // ft.replace(R.id.content_frame, new SecondFragment()); 
      // setTitle("Second"); 
       break; 
      case 3: 
       // ft.replace(R.id.content_frame, new ThirdFragment()); 
      // setTitle("Third"); 
       break; 

      default: 
       break; 
      } 
      // update selected item and title, then close the drawer 
      mDrawerList.setItemChecked(position, true); 
      //setTitle(mTitles[position]); 
      mDrawerLayout.closeDrawer(mDrawerList); 
     } 

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

     /** 
     * When using the ActionBarDrawerToggle, you must call it during 
     * onPostCreate() and onConfigurationChanged()... 
     */ 

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

     @Override 
     public void onConfigurationChanged(Configuration newConfig) { 
      super.onConfigurationChanged(newConfig); 
      // Pass any configuration change to the drawer toggls 
      mDrawerToggle.onConfigurationChanged(newConfig); 
     } 

     /** 
     * Fragment that appears in the "content_frame", shows a planet 
     */ 
     public static class PlanetFragment extends Fragment { 
      public static final String ARG_PLANET_NUMBER = "planet_number"; 

      public PlanetFragment() { 
       // Empty constructor required for fragment subclasses 
      } 

     // @Override 
     /* public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 
       View rootView = inflater.inflate(R.layout.fragment_planet, container, false); 
       int i = getArguments().getInt(ARG_PLANET_NUMBER); 
       String planet = getResources().getStringArray(R.array.planets_array)[i]; 

       int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()), 
           "drawable", getActivity().getPackageName()); 
       ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId); 
       getActivity().setTitle(planet); 
       return rootView;      */ 
      } 

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

+0

ли() метод который вызывается ваш SelectItem? – Endzeit

+0

Да, так как начинается действие? но не при нажатии элемента списка. –

+0

Я не знаю, где ошибка, но я бы позволил своей деятельности реализовать _ListView.OnItemClickListener_, установить onClickListener из ListView в _this_ и реализовать метод _onItemClick() _ в вашей деятельности вместо отдельного класса. – Endzeit

ответ

60

Проблема z заказ. При расширении списка в onDrawerOpened сайте:

mDrawerList.bringToFront(); 
mDrawerLayout.requestLayout(); 

В этом посте объяснить проблему и как это исправить: http://vardhan-justlikethat.blogspot.com.es/2014/05/android-custom-navigation-drawer-not.html

+1

Это исправлено, спасибо. –

+0

Спасибо. Помог мне. – nlmm01

+1

1-й линии мне кажется достаточно. –

0

Похоже, что ваша DrawerItemClickListener.class не работает, как только время selectItem() вызывается метод находится в конце вашей деятельности onCreate() на selectItem(0);

Вместо вызова

mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

вы можете использовать this в качестве параметра и позвольте вам Activity реализовать сам ListView.OnItemClickListener.

public class MyActivity extends Activity implements ListView.OnItemClickListener { 

    public void onCreate(Bundle savedInstanceState) { 
     [...] 
     mDrawerList = (ListView) findViewById(R.id.left_drawer); 

     [...] 
     mDrawerList.setOnItemClickListener(this); 
     [...] 
    } 

    [...]  

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

    private void selectItem(int position) { 
     switch (position) { 
      case 1: 
       [...] 
       startActivity(new Intent(this, SplashScreen.class)); 
       break; 
      [...] 
      default: 
      break; 
     } 
     [...] 
    } 
    [...] 
} 
+0

@ J4C3N-14 Это работает сейчас? :) – Endzeit

+0

Привет, спасибо за вашу помощь, Нет, к сожалению, похоже, что это не решило? любые идеи –

1

Вы должны проверить, если у вас есть android:animateLayoutChanges="true" атрибут ListView родителя (в макете ресурса). Удаление этого атрибута сработало для меня.

12

Fixed подобный вопрос, добавив drawerView.bringToFront(); к

@Override 
public void onDrawerOpened(View drawerView) { 

} 
+1

Это помогло мне! – erdomester

+3

Кроме того, эту функцию можно найти, используя: mDrawer.addDrawerListener (новый DrawerLayout.DrawerListener() {...}); требуют поддержки-v4-23.2 + – Tobliug

-1

Я также возникла проблема с не реагированием на драйвер навигации по кликам. Как-то я нашел решение: проблема была в файле 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"> 

<!-- As the main content view, the view below consumes the entire 
    space available using match_parent in both dimensions. --> 
<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<!-- android:layout_gravity="start" tells DrawerLayout to treat 
    this as a sliding drawer on the left side for left-to-right 
    languages and on the right side for right-to-left languages. 
    The drawer is given a fixed width in dp and extends the full height of 
    the container. A solid background is used for contrast 
    with the content view. --> 


<ListView 
    android:id="@+id/left_drawer" 
    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="#ffff"/> 

надеюсь, что это будет полезно.

2

Если у вас есть список в панели навигации, то просто написать код и сделать ListView кликабельным:

list.bringToFront(); 
drawerLayout.requestLayout(); 
Смежные вопросы