Я хочу изменить текст TextView внутри заголовка панели навигации. Но я получаю такую ошибку:
java.lang.NullPointerException: попытка вызвать виртуальный метод void android.widget.TextView.setText (java.lang.CharSequence) для ссылки на нулевой объект
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
nav_header_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/slide_nav_bar"
android:gravity="bottom"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageView
android:id="@+id/tvHeaderIcon"
android:layout_width="60dp"
android:layout_height="60dp"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:src="@android:drawable/sym_def_app_icon" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:text="@string/app_name"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
<TextView
android:id="@+id/tvHeaderName"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MainActivity.java
TextView tvHeaderName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvHeaderName= (TextView) findViewById(R.id.tvHeaderName);
tvHeaderName.setText("Saly");
}
Как я могу это сделать?
TextView
заголовок панели навигации, используйте этот код вActionBarDrawerToggle.onDrawerOpened()
методе. См. Stackoverflow.com/a/35952939/1657502 .Сначала вы должны расширить макет заголовка из NavigationView ...
navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); tvHeaderName= (TextView) navHeaderView.findViewById(R.id.tvHeaderName); tvHeaderName.setText("Saly");
источник
Вот версия кода Kotlin, надеюсь, она кому-то поможет.
val navigationView : NavigationView = findViewById(R.id.nav_view) val headerView : View = navigationView.getHeaderView(0) val navUsername : TextView = headerView.findViewById(R.id.txtUserName) val navUserEmail : TextView = headerView.findViewById(R.id.txtEmail) navUsername.text = username.toString() navUserEmail.text = email.toString()
источник
Вы также можете использовать эту библиотеку поддержки дизайна 23.1.1.
View header = navigationView.getHeaderView(0) TextView text = (TextView) header.findViewById(R.id.textView);
Ссылка: https://stackoverflow.com/a/33692431/2761923
источник
Вам нужно получить идентификатор NavigationView в своей деятельности, как это
Теперь получите макет HeaderView, используя идентификатор Navigationview, как это
View headerView = navigationView.getHeaderView(0);
Теперь вы можете получить любой идентификатор представления и выполнить действие, которое хотите, например
TextView navUsername = (TextView) headerView.findViewById(R.id.navUsername); navUsername.setText("Your Text Here");
источник
Используйте это, чтобы получить заголовок навигации
View hview = navigationView.getHeaderView(0);
затем используйте hview, чтобы получить разные представления заголовка навигации и делать все, что хотите
иначе, используя
navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main);
это, создается новый заголовок с индексом 1.источник
По сути, мы должны получить экземпляр представления навигации, расширив представление навигации в переменной представления, позже вы можете получить экземпляр textView для редактирования текстового представления.
источник
Что сработало для меня? это это: -
Но не забудьте удалить это из вашего xml файла, то есть из NavigationView: -
app:headerLayout="@layout/nav_header_main"
Хорошо, помимо этого ответа ... через несколько месяцев я понял, что есть лучший способ сделать это, если вы достаточно продвинуты в разработке Android! Просто поместите туда макет кадра и загрузите в него фрагмент, внутри которого у нас есть Recyclerview и раздел заголовка. С Recyclerview вы можете настроить заголовок, как вам нравится, с текстовыми представлениями, изображением и многим другим, как вам нравится. Последнее приложение, над которым я работаю, как раз и сделало это: динамически передаваемые данные в Recyclerview из фрагментарной активности без значков, а также помещали относительный макет (внутри текстовых представлений и изображений), который действует как заголовок поверх Recyclerview.
источник
Это сработало для меня:
NavigationView navigationView = findViewById(R.id.nav_view); View headerView = navigationView.getHeaderView(0); TextView title = headerView.findViewById(R.id.nav_title); TextView subTitle = headerView.findViewById(R.id.nav_sub_title);
источник
val navigationView = findViewById<View>(R.id.nav_view_home) as NavigationView val headerView = navigationView.getHeaderView(0) val tvUserName = headerView.findViewById<View>(R.id.tvUserName) as TextView tvUserName.text=(Preference.getInstance("your text")
источник
У меня такая же проблема, но оба решения не помогли мне
У меня почти такой же код, как указано выше:
NavigationView navigationView = (NavigationView)findViewById(R.id.navigation_content); View headerView = navigationView.inflateHeaderView(R.layout.nav_header); TextView navUsername = (TextView) headerView.findViewById(R.id.nav_header_username); navUsername.setText("Hello, "+mUserSession.getLoggedUserData().getmFirstName());
источник