Programming

NavigationView get / find 헤더 레이아웃

procodes 2020. 6. 2. 21:23
반응형

NavigationView get / find 헤더 레이아웃


내 NavigationView에는 활성 버튼이있는 ID가 'viewId'인 헤더 레이아웃이 있습니다. 해당 버튼을 설정하려면 활동에서 다음을 수행하십시오 onPostCreate.

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

새로운 버전의 안드로이드 지원 라이브러리 ( 23.1.0 )에서는 뷰를 찾을 수 없으며 null을 반환합니다. 이전 버전에서는 잘 작동했습니다. 버그입니까, 아니면이 기능을 잘못 사용하고 있습니까? 그렇다면 헤더 레이아웃에 액세스하여 동작을 추가하는 방법은 무엇입니까?


버전 23.1.0 NavigationViewRecyclerView(이전이 아닌) 을 사용하도록 전환 ListView하고 헤더가 해당 요소 중 하나로 추가됩니다. 즉, 즉시 호출 할 수 없습니다 findViewById(). 레이아웃 패스를 연결하기 전에 필요합니다 NavigationView.

들어 버전 23.1.1 지원 라이브러리, 당신은 지금 사용하는 헤더보기에 대한 참조를 얻을 수 있습니다 getHeaderView():

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

이는 XML과 코드를 통해 추가 된 헤더 작업에 이점이 있습니다.

관련 버그에 따라 여전히 23.1.0을 사용하는 경우 코드에 헤더 를 부풀려서 사용할 수 있습니다 findViewById().

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

23.1.1로 이동할 때까지.


이제 디자인 지원 라이브러리의 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);

이것이 내가 사용했던 방법 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);

나에게 그것은 23.1.0과 같은 상황이며, 업데이트 후 null 포인터 예외가됩니다. 이 경우 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);

그 후, nav_heard레이아웃으로 정의 된 모든보기를 id로 찾을 수 있습니다 .


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 ");

참고 URL : https://stackoverflow.com/questions/33194594/navigationview-get-find-header-layout

반응형