2014-10-19 3 views
12

У меня есть библиотека, которая требует использования цвета TextView для заголовка ActionBar. До AppCompat v7 r21 я мог бы просто findViewById и получить цвет из представления напрямую. Однако по какой-то причине сейчас это не работает. Представление всегда равно нулю. Я написал код, который анализирует всю иерархию представлений и выводит идентификаторы, типы и значения для всех текстовых элементов. Заголовок не имел идентификатора, который я считаю очень странным.Получение заголовка ActionBar TextView с AppCompat v7 r21

Единственное, что я заметил, это когда я попытался получить ActionBar, что было возвращено, это панель инструментов (хотя я не использовал панель инструментов в своем приложении). Таким образом, я перебирал взгляды детей на панели инструментов и всякий раз, когда был найден TextView, я сравнивал его текстовое значение с toolbar.getTitle(), чтобы убедиться, что это TextView, который я ищу. Не идеально, и я не уверен, что он будет работать для всех случаев.

Кто-нибудь знает, что может быть самым безопасным решением?

+0

Возможно, вы нашли решение? – Bene

+0

Нет, я просто застрял с моим кодом для поиска заголовка TextView через перемещение детей на Панели инструментов. –

+0

Взгляните на мой тент здесь: http://stackoverflow.com/a/26888120/2742962 – BugsBunnyBR

ответ

18

Как правило, при использовании панели инструментов в моих случаях, если я делаю что-то нестандартное с заголовком, я просто раздую представление заголовка вручную, а затем задаю его атрибуты в XML. Точка панели инструментов, чтобы предотвратить такие вещи, как это происходило, так что вы можете иметь больше контроля над тем, что ваша панель выглядит

<android.support.v7.widget.Toolbar 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/my_awesome_toolbar" 
     android:layout_height="@dimen/standard_vertical_increment" 
     android:layout_width="match_parent" 
     android:minHeight="@dimen/standard_vertical_increment" 
     android:background="@drawable/actionbar_background"> 


     <TextView 
      style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" 
      android:id="@+id/toolbar_title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="@color/Red" /> 

    </android.support.v7.widget.Toolbar> 

Затем в коде, вы могли бы сделать что-то вроде этого:

Toolbar toolbar = findViewById(R.id.my_awesome_toolbar); 
//Get rid of the title drawn by the toolbar automatically 
toolbar.setTitle(""); 
TextView toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title); 
toolbarTitle.setTextColor(Color.BLUE); 

Я знаю, что это более старая запись, но это был лучший способ, который я нашел для разрешения пользовательского цвета и шрифтов textc на панели инструментов.

+1

Спасибо, так как я могу изменить панель инструментов в любом месте в приложении. – danigonlinea

+0

Как мне заставить его перемещаться при прокрутке, используя новую библиотеку дизайна и CollapsingToolbarLayout? Мне нужно использовать как заголовок, так и субтитры, но, к сожалению, что субтитры не появляются при использовании новой библиотеки дизайна –

19

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

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 

// loop through all toolbar children right after setting support 
// action bar because the text view has no id assigned 

// also make sure that the activity has some title here 
// because calling setText() with an empty string actually 
// removes the text view from the toolbar 

TextView toolbarTitle = null; 
for (int i = 0; i < toolbar.getChildCount(); ++i) { 
    View child = toolbar.getChildAt(i); 

    // assuming that the title is the first instance of TextView 
    // you can also check if the title string matches 
    if (child instanceof TextView) { 
     toolbarTitle = (TextView)child; 
     break; 
    } 
} 
+0

очень хороший подход –

+0

Отлично подходит для меня! спасибо – gutte

2

Я получил его, используя отражение.

toolbar = (Toolbar) findViewById(R.id.toolbar); 
toolbar.setTitle("Title"); //important step to set it otherwise getting null 
TextView title = null; 
try{ 
     Field f = toolbar.getClass().getDeclaredField("mTitleTextView"); 
     f.setAccessible(true); 
     title = (TextView) f.get(toolbar); 
     title.setText("I have title TextView"); 
} catch(Exception e){ 
     e.printStackTrace(); 
} 

Пожалуйста, обратите внимание, что это работает, если я панель инструментов не набор для поддержки ActionBar ...

setSupportActionBar(toolbar); // with this set text view behave differently 
           //and text may not be visible... 
1

Вы можете сделать это Лик.

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 
TextView title=(TextView)toolbar.getChildAt(0); 

Это работа для меня.

+0

и как установить getChildAt (0)? Например, я хочу загрузить электронное письмо, например ** todo @ so.com **, с кодом выше, как я могу это сделать? – pnet

Смежные вопросы