我有一個簡單的導航抽屜佈局設置。我正在使用設計支持庫,因此我有一個導航視圖可以在支持庫的工具欄上滑動。但是,頁眉佈局正在響應用戶界面中的點擊。當我點擊它時,出現在標題佈局後面的連鎖反應。我怎樣才能做到以下兩種情況之一:Android NavigationView:我如何處理/禁用頁眉佈局的選擇?
- 一起禁用點擊交互? (所以不會產生波紋效果)
- 響應抽頭交互。
我似乎無法找到任何文檔。
我有一個簡單的導航抽屜佈局設置。我正在使用設計支持庫,因此我有一個導航視圖可以在支持庫的工具欄上滑動。但是,頁眉佈局正在響應用戶界面中的點擊。當我點擊它時,出現在標題佈局後面的連鎖反應。我怎樣才能做到以下兩種情況之一:Android NavigationView:我如何處理/禁用頁眉佈局的選擇?
我似乎無法找到任何文檔。
我注意到了同樣的問題。這個組件使用一個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),我建議暫時不要使用它。
您可以覆蓋佈局資源「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。
這對於問題的解決方法:
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
}
});
從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);
我只是在我自己的應用程序處理這個。 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部件的內部的,但在這種情況下,它的支持庫,它與您的應用程序一起打包並隨附。從長遠來看,建立自己的自定義導航視圖可能會更好,但有時您需要快速修復!
本頁面上的解決方案都不適合我,可能有很好的理由。正如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
}
什麼是你描述的着色錯誤? –
查看:https://code.google.com/p/android/issues/detail?id = 176133 – BladeCoder