Android NavigationView:如何处理/禁用标题布局的选择?

时间:2015-07-03 01:37:04

标签: android navigation-drawer material-design androiddesignsupport

我有一个简单的导航抽屉布局设置。我正在使用设计支持库,所以我有一个导航视图,可以在支持库的工具栏上方滑动。但是,标题布局响应UI中的点击。当我点击它时,我的标题布局后面出现了涟漪效果。我该怎么做以下任何一种:

  1. 一起禁用点击互动? (所以没有发生连锁反应)
  2. 回应了点击互动。
  3. 我似乎找不到任何关于此的文件。

6 个答案:

答案 0 :(得分: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),我建议暂时不要使用它。

答案 1 :(得分: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
    }
});

答案 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。

答案 3 :(得分: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);

答案 4 :(得分: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小部件内部的东西,但在这种情况下,它是支持库,它与您的应用程序打包在一起。从长远来看,建立自己的自定义导航视图可能更好,但有时需要快速修复!

答案 5 :(得分:0)

此页面上没有任何解决方案适用于我,可能有充分的理由。正如BladeCoder所接受的答案所述,侦听器被硬编码到NavigationDrawer ListView中,并且标题视图是ListView的Adapter的第0项。如果您想要实际禁用它,那么简单地覆盖膨胀的标题视图的onClickListener将不起作用,因为您需要为ListView的Adapter项而不仅仅是膨胀的视图引用onClickListener。

以下解决方案适用于我不允许点击/点击标题视图,但它不会禁用可聚焦性(例如使用d-pad或键盘)。我似乎无法弄清楚到底是怎么回事。

<?php
$id=16;
echo "<td><a class='btn btn-primary' href='edit_news.php?id=$id'><i class='fa fa-pencil fa-fw'></i> Edit</a></td>";
?>