Есть ли способ контролировать представления внутри заголовка NavigationView?

Как гласит название, я хочу знать, есть ли способ контролировать представления внутри заголовка NavigationView? (За исключением добавления или удаления заголовка.)

Например: В заголовке у меня есть аватар пользователя. По умолчанию он отображает гостевой образ, но после входа пользователя в систему будет показан реальный аватар.

Как это можно сделать?

Ответ 1

После обновления вашей библиотеки поддержки до версии 23.1.1 или выше

Вы можете сделать это -

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

или если у вас несколько заголовков

navigationView.getHeaderCount()

Ссылка: https://code.google.com/p/android/issues/detail?id=190226#c31

Ответ 2

Так как я не могу принять комментарий в качестве ответа. Итак, я отвечу Moinkhan 'здесь:

сначала создайте заголовок XML как lay_header.xml

<TextView
    android:id="@+id/tvThought"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

в вашем java файле раздуйте этот выше заголовок в TextView. как

TextView headerView = (TextView) LayoutInflater.from(this).inflate(R.layout.lay_header, null);
headerView.setText("Your_thoght");

Теперь добавьте его как HeaderView

navView = (NavigationView) findViewById(R.id.navView);
navView.addHeaderView(headerView);

Вот оно...

Вы также можете проверить это: Настройка NavigationView - Добавление динамического headerView, библиотеки дизайна поддержки Android

Большое спасибо! И снова нам нужна функция, позволяющая пользователю принимать комментарий как ответ!

Ответ 3

Другой способ сделать это - использовать метод "inflateHeaderView()" объекта NavigationView, например, ниже (после использования "setContentView()" ):

View headerLayout = navigationView.inflateHeaderView(R.layout.yours_nav_header_layout);

После этой точки вы можете использовать "headerLayout" для доступа к пользовательским представлениям в макете заголовка, как показано ниже:

View cutomView = (TextView) headerLayout.findViewById(R.id.lay_sign_in);

В моем случае я использую структуру ButterKnife, чтобы ввести View "navigationView" следующим образом:

@Bind(R.id.nav_view) NavigationView navigationView;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

Ответ 4

Просто попробуйте найти свое представление в своей деятельности:

tvUserName = (TextView) findViewById(R.id.tv_username);

Это работает для меня. Мой макет заголовка:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:background="?attr/colorPrimaryDark"
    android:padding="16dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"
    android:orientation="vertical"
    android:gravity="bottom">

    <TextView
        android:id="@+id/tv_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1"/>

</LinearLayout>

My NavigationView в макете активности:

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

И BTW, я столкнулся с проблемой при раздувании LinearLayout, где параметры макета не предоставляются:

TextView headerView = (TextView) LayoutInflater.from(this).inflate(R.layout.lay_header, null);
headerView.setText("Your_thoght");

Надеюсь, что это поможет.