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也有一個圖標着色的bug (在版本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"/> 

如果您想響應點擊,您可以通過id查找視圖並添加一個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是一個包裹在ListView中的ScrimInsetsFrameLayout,它明確地忽略(拋出)列表中第一項(即標題)上的點擊。

但是,你可以通過你自己的包裹NavigationView的onItemClickListener自行取回他們:

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所接受的答案所述,監聽器被硬編碼到NavigationDrawer ListView中,並且標題視圖是ListView適配器的第0項。如果你想實際禁用它,簡單地重寫onClickListener對於膨脹的頭部視圖將不起作用,因爲你需要引用ListView的Adapter項目的onClickListener而不是僅僅膨脹的視圖。

以下解決方案適用於我禁止點擊/輕敲標題視圖,但它不禁用可聚焦性(例如使用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 
    }