【问题标题】:NavigationView get/find header layoutNavigationView 获取/查找标题布局
【发布时间】:2016-01-16 15:07:17
【问题描述】:

在我的 NavigationView 中,我有一个带有活动按钮的 id 'viewId' 的标题布局。要设置这些按钮,我在活动的onPostCreate 中执行以下操作:

final View panel = findViewById(R.id.viewId);
panel.setOnClickListener(new View.OnClickListener() {
... setup goes here ...
});

使用新版本的android支持库,(23.1.0),视图找不到,返回null。使用以前的版本,它运行良好。是错误还是我使用此功能错误?如果是这样,如何访问标题布局并为其添加行为?

【问题讨论】:

    标签: android android-support-library android-design-library navigationview


    【解决方案1】:

    23.1.0 版将NavigationView 切换为使用RecyclerView(而不是之前的ListView),并且将标头添加为这些元素之一。这意味着它不能立即调用 findViewById() - 在将其附加到 NavigationView 之前需要布局传递。

    对于支持库的version 23.1.1,您现在可以使用getHeaderView() 获取对标题视图的引用:

    View headerLayout = navigationView.getHeaderView(0); // 0-index header
    

    这具有处理通过 XML 和代码添加的标头的优势。

    如果您仍在使用 23.1.0,根据 the related bug,您可以在代码中填充标头并在其上使用 findViewById()

    View headerLayout = 
        navigationView.inflateHeaderView(R.layout.navigation_header);
    panel = headerLayout.findViewById(R.id.viewId);
    // panel won't be null
    

    直到您移至 23.1.1。

    【讨论】:

    • 感谢您的及时帮助,将使用解决方法。拥有专用方法似乎是要走的路,希望在未来的版本中会有它。
    • @AlexanderFarber - 我发布的代码可用于 API 7
    • 我更喜欢降级库。引入错误就像来自 Google 的签名。如果新版本有错误,那么 Google 会发布该新版本
    • @GFPF - 当您调用 inflateHeaderView 时,它会在 RecyclerView 的正确层中为您附加视图以及正确的父级 - 这是您无法在外部对 NavigationView 执行的操作。
    • @RmK - 谢谢,我已更新以反映 23.1.1 中添加的新 API 以检索通过 XML 添加的标头(因为之前的解决方法仅适用于通过代码添加的标头)。
    【解决方案2】:

    现在有了 23.1.1 版本的设计支持库,您可以使用

    NavigationView navigationView = (NavigationView) findViewById(R.id.your_nav_view_id);
    View header = navigationView.getHeaderView(0)
    TextView text = (TextView) header.findViewById(R.id.textView);
    

    【讨论】:

    • 你也可以使用navigationView.getHeaderCount(),以防你有超过1个标题。
    【解决方案3】:

    这就是我使用ButterKnife 的方式,它对我有用。

    protected static class HeaderViewHolder {
    
        @BindView(R.id.button)
        Button button;
    
        HeaderViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }
    

    然后像这样使用这个视图持有者:

    View header = navigationView.getHeaderView(0);
    headerViewHolder = new HeaderViewHolder(header);
    

    【讨论】:

    • 当您想从 Activity 中删除 View 相关逻辑时,这是完美的选择。好主意!
    • 它与 ButterKnife 完美配合,谢谢兄弟。
    【解决方案4】:

    对我来说这与 23.1.0 的情况相同,更新后的空指针异常变为。在这种情况下,NavigatorView 看起来像:

    <android.support.design.widget.NavigationView
      android:id="@+id/navigation_view"
      android:layout_height="match_parent"
      android:layout_width="wrap_content"
      android:layout_gravity="start"
      android:fitsSystemWindows="true"
      app:headerLayout="@layout/nav_header"
      app:menu="@menu/menu_nav"/>
    

    我尝试了 ianhanniballake 提出的解决方案,但它不起作用。然后我夸大了一句:

    LayoutInflater.from(getContext()).inflate(R.layout.nav_header, mNavigationView);
    

    之后,我可以通过 id 找到 nav_heardlayout 中定义的所有视图。

    【讨论】:

      【解决方案5】:
      NavigationView navigationView = findViewById(R.id.your_nav_view);
      View header = navigationView.getHeaderView(0);
      TextView textUsername = header.findViewById(R.id.textView);
      textUsername.setText("you text here ");
      

      【讨论】:

      • 您好,欢迎来到 Stack Overflow!请添加一些文字来解释这如何解决上面提出的问题。谢谢!
      【解决方案6】:
      NavigationView navigationView = findViewById(R.id.your_nav_view);
      View header = navigationView.getHeaderView(0);
      TextView textUsername = header.findViewById(R.id.textView);
      textUsername.setText("you text here ")
      

      【讨论】:

        【解决方案7】:

        在 Kotlin 中 @Francois Dermu 代码就像

        val navigationView : NavigationView = findViewById(R.id.your_nav_view_id);
        val header = navigationView.getHeaderView(0)
        val textView = header.findViewById<TextView>(R.id.textView)
        

        【讨论】:

          【解决方案8】:

          Kotlin 版本。

          val navView: NavigationView = findViewById(R.id.nav_view)       
          // set User Name
          val headerView: View = navView.getHeaderView(0)
          headerView.txtUserName.text = "User Name Goes here"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-18
            • 2018-08-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多