代码之家  ›  专栏  ›  技术社区  ›  Panagiotis Bougioukos

如何使用app namespace[duplicate]从xml检索嵌套元素

  •  0
  • Panagiotis Bougioukos  · 技术社区  · 4 年前

    onPostCreate :

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

    有了新版android支持库( 23.1.0 ),找不到视图,返回null。与以前的版本,它工作得很好。这是一个错误还是我用错了这个功能?如果是这样,如何访问标题布局并向其添加行为?

    0 回复  |  直到 9 年前
        1
  •  442
  •   ianhanniballake    9 年前

    23.1.0版交换机 NavigationView 使用 RecyclerView (而不是之前的 ListView findViewById() -在将布局过程附着到 导航视图 .

    为了 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。

        2
  •  145
  •   OneCricketeer Gabriele Mariotti    9 年前

    现在,在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);
    
        3
  •  13
  •   Wahib Ul Haq    8 年前

    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);
    
        4
  •  8
  •   Javier C. Issac Balaji    7 年前

    对我来说,这与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"/>
    

    我尝试了由汉尼拔提出的解决方案,但它不起作用。然后我说了一句话:

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

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

        5
  •  3
  •   indrit saveta    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 ");
    
        6
  •  0
  •   Alex    5 年前

    在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)
    
        7
  •  0
  •   Qadir Hussain    5 年前

    val navView: NavigationView = findViewById(R.id.nav_view)       
    // set User Name
    val headerView: View = navView.getHeaderView(0)
    headerView.txtUserName.text = "User Name Goes here"
    
        8
  •  0
  •   Jin Lee    4 年前
    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 ")