source

탐색보기헤더 레이아웃 가져오기/찾기

manysource 2023. 8. 23. 21:52

탐색보기헤더 레이아웃 가져오기/찾기

내 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 스위치NavigationView를 사용하기 위해RecyclerView(이전보다)ListView헤더가 이러한 요소 중 하나로 추가됩니다.즉, 즉시 전화를 사용할 수 없습니다.findViewById()레이아웃 패스는 연결되기 전에 필요합니다.NavigationView.

Support Library 버전 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"/>

이안 하니발레이크의 솔루션 제안을 시도해 보았지만 효과가 없습니다.그리고 나서 저는 다음과 같은 문장으로 부풀렸습니다.

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

그런 다음 id에서 정의된 모든 뷰를 찾을 수 있습니다.nav_heard배치도

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

코틀린에서 @프랑수아 더무 코드는 다음과 같습니다.

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

코틀린 버전.

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

Java에서 작동합니다.

   navigationView = findViewById(R.id.nav_view);
    View viewHeader = navigationView.getHeaderView(0);
    ((TextView)viewHeader.findViewById(R.id.tv_name)).setText(preferences.getString(MyConstant.NAME,"n/a"));

서랍에서 사용자 이름을 변경하는 방법은 다음과 같습니다.

NavigationView mNavigationView = findViewById(R.id.nav_view);
View mHeaderView = mNavigationView.getHeaderView(0);
TextView usernameTextview = mHeaderView.findViewById(R.id.drawer_email_textField);
Bundle b = getIntent().getExtras();
String username = b.getString("email");
usernameTextview.setText(username);

그것은 나에게 효과가 있습니다.

언급URL : https://stackoverflow.com/questions/33194594/navigationview-get-find-header-layout