Настройка NavigationView - Добавление динамического headerView, Android Design Design Library

Я попробовал навигацию из новой библиотеки дизайна поддержки Android. Я хочу иметь динамический headerview. В принципе, мой headerview покажет что-то вроде цитаты дня. У меня есть около 10 кавычек, и я хочу случайно выбрать цитату и отобразить в текстовом виде в headerView. Я также хочу добавить метод onClick для headerView.

В настоящее время я не вижу возможности изменять макет headerview программно. Любые предложения по реализации этого?

Ответ 1

сначала создайте заголовок 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);

Вот оно...

Ответ 2

После обновления новой библиотеки поддержки (23.1.1)

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

Добавьте headerview в app:headerLayout="@layout/drawer_header" внутри NavigationView.

Затем вы можете получить к нему доступ,

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

Ответ 3

TextView txt2;
txt2 = (TextView) navigationView.inflateHeaderView(R.layout.nav_header_main).findViewById(R.id.textView2);
txt2.setText("wow! It works like a charm");

Ответ 4

enter image description here

создать макет заголовка внутри текста,

<TextView
                android:id="@+id/profile_email_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@id/profile_image"
                android:layout_alignParentBottom="true"
                android:layout_toLeftOf="@id/expand_account_box_indicator"
                android:ellipsize="end"
                android:maxLines="1"
                android:paddingBottom="16dp"
                android:singleLine="true"
                android:clickable="true"
                android:onClick="onSelectText"
                android:text="[email protected]"
                android:textColor="@color/body_text_2_inverse"
                android:textSize="@dimen/text_size_medium" />

in onCreate,

((TextView) findViewById(R.id.profile_email_text)).setText("test");

создать способ onSelectText в вашей деятельности

public void onSelectText(View v){
        if(v.getId() == R.id.profile_email_text){
            Snackbar
                    .make(fab, "clicked on sub title", Snackbar.LENGTH_LONG)
                            //.setAction(R.string.snackbar_action, myOnClickListener)
                    .show();
            drawer_layout.closeDrawers();
        }
    }

Ответ 5

Вы можете добавить свой собственный заголовок программным путем, вызвав addHeaderView в вашем навигационном экране, или определите его в файле макета, используя app:headerLayout="@layout/myheader".

Ответ 6

Вы можете использовать findViewById() для доступа к элементам заголовка в NavigationView. Это работает, даже если вы инициализировали заголовок с свойством headerLayout, например. app:headerLayout="@layout/drawer_header". Затем вы можете динамически изменять заголовок без необходимости накачивать или добавлять новый заголовок.

@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {

...

if(mNavItemId == R.id.drawer_item_1)
{
  View headerView = mNavigationView.findViewById(R.id.drawer_header_root);
  // Test modifying the size of the header root element (FrameLayout)
  // when the first menu item is clicked.
  LinearLayout.LayoutParams p = (LinearLayout.LayoutParams) headerView.getLayoutParams();
  p.height = p.height == 700 ? 400 : 700;
  headerView.setLayoutParams(p);
  return true;
}
...

drawer_header.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="196dp"
android:background="@color/drawer_header_bg"
android:orientation="vertical"
android:id="@+id/drawer_header_root">
...

Я думаю, что Дхавал говорит то же самое, но это было не очень ясно.

Ответ 7

Моя ссылка поможет вам

более тонкий вопрос

final NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);

View headView = navigationView.getHeaderView(0);

((TextView) headView.findViewById(R.id.nav_title)).setText("New title");

Ответ 8

Сначала вам нужно получить navigationView. NavigationView navigationView =(NavigationView)findViewById(R.id.nav_view);

Затем заголовок. View header = navigationView.getHeaderView(0) Затем textView. TextView text = (TextView) header.findViewById(R.id.textView); И, наконец, вы можете установить текст, который хотите отобразить. text.setText("Hello there");