Есть ли способ контролировать представления внутри заголовка 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");
Надеюсь, что это поможет.