2

У меня есть простая настройка макета навигационного ящика. Я использую библиотеку поддержки дизайна, поэтому у меня есть одно навигационное представление, которое отображается на панели инструментов библиотеки поддержки. Однако компоновка заголовка отвечает на краны в пользовательском интерфейсе. Я получаю этот эффект пульсации, появляющийся за компоновкой заголовка, когда я нажимаю его. Как я могу выполнить одно из следующих действий:Android NavigationView: как мне обрабатывать или отключать выбор макета заголовка?

  1. Отключить взаимодействие между контактами? (так что не возникает эффекта пульсации)
  2. Ответьте на взаимодействие крана.

Возможно, я не могу найти документацию по этому вопросу.

ответ

2

Я заметил ту же проблему. Этот компонент использует ListView внутри (так называемый menuView ниже), и, к сожалению, нет возможности отключить выбор заголовка, потому что это жестко:

this.mHeader = (LinearLayout)this.mLayoutInflater.inflate(layout.design_navigation_item_header, this.mMenuView, false); 
this.mMenuView.addHeaderView(this.mHeader); 
this.mMenuView.setAdapter(this.mAdapter); 
this.mMenuView.setOnItemClickListener(this); 

Добавим, что к тому, что NavigationView также имеет иконки красящие ошибка (в версии 22.2.0), я бы предложил не использовать его на данный момент.

+0

Какая ошибка цвета, которую вы описываете? –

+1

Проверьте это: https://code.google.com/p/android/issues/detail?id=176133 – BladeCoder

0

Вы можете переопределить ресурс макета «design_navigation_item_header» и добавить цвет фона, а затем вы не увидите пульсацию.

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@android:color/white" 
    android:orientation="vertical" 
    android:paddingBottom="@dimen/navigation_separator_vertical_padding"/> 

Если вы хотите, чтобы ответить на кнопку вы можете посмотреть мнение по идентификатору и добавить OnClickListener.

1

Это может быть обходной путь для выпуска:

View headerView = getLayoutInflater().inflate(R.layout.header_nav, mNavigationView, false); 
mNavigationView.addHeaderView(headerView); 

//Use this if you don't want the click listener, 
//be sure to use the appropriate background color 
//((ViewGroup) headerView.getParent()).setBackgroundResource(R.color.background_material_light); 

//If you want your header to respond to clicks, this should suffice 
headerView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     //Open to your implementation 
    } 
}); 
0

Принимая советы от razzledazzle's post, просто потребляя OnClick работает

View headerView = LayoutInflater.from(getActivity()).inflate(R.layout.drawer_header_view, menuItemsNavigationView, false); 

headerView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // Consume input from header view. This disables the ripple effect 
    } 
}); 

menuItemsNavigationView.addHeaderView(headerView); 
0

я просто справлялся с этим в моем приложении. NavigationView - это ScrimInsetsFrameLayout, обернутый вокруг ListView, и он явно игнорирует (выбрасывает) клики по первому элементу списка, который является заголовком.

Однако, вы можете получить их самостоятельно, обернув onItemClickListener в NavigationView с самостоятельно:

ListView menuList = (ListView) navigationView.getChildAt(0); 
    final AdapterView.OnItemClickListener nativeListener = menuList.getOnItemClickListener(); 
    menuList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      if (position == 0) { 
       drawerLayout.closeDrawer(GravityCompat.START); 
       onUserClicked(prefs.getUser()); 
      } 
      nativeListener.onItemClick(parent, view, position, id); 
     } 
    }); 

Обычно я не поддерживаю такого рода, опираясь на внутренностях Android виджетов, но в данном случае это поддержка, которая упакована и поставляется с вашим приложением. Вероятно, лучше создать собственный пользовательский вид навигации в долгосрочной перспективе, но иногда вам нужно быстрое исправление!

0

Ни одно из решений на этой странице не работало для меня, и, вероятно, не без оснований. Поскольку принятый ответ BladeCoder гласит, слушатель жестко закодирован в ListView NavigationDrawer, а заголовок - это 0-й элемент адаптера ListView. Простое переопределение onClickListener для завышенного заголовка не будет работать, если вы хотите его фактически отключить, поскольку вам нужно ссылаться на onClickListener для элемента списка ListView, а не только на раздутое представление.

Нижеприведенное решение работает для того, чтобы я запретил нажимать/нажимать на заголовок, но он не отключает фокусируемость (например, с помощью d-pad или клавиатуры). Кажется, я не могу понять, как это делается.

//get the listview within the navigation drawer (0th child) 
    ListView menuList = (ListView) mNavigationView.getChildAt(0); 

    //get the header view (0th item in listview adapter) 
    final View headerView = menuList.getAdapter().getView(0, null, null); 

    if (headerView != null) { 
     headerView.setEnabled(false); //doesn't work, should 
     headerView.setFocusable(false); //doesn't work, should 
     headerView.setFocusableInTouchMode(false); //doesn't work, should 
     headerView.setClickable(false); //doesn't work, should 
     headerView.setOnClickListener(null); //WORKS! works to disallow clicking! is still focusable via keyboard 
    } 
Смежные вопросы