В приложении для Android метод Toolbar.setTitle не имеет никакого эффекта - имя приложения отображается в виде заголовка


298

Я пытаюсь создать простое приложение, используя библиотеку android-support-v7: 21. Фрагменты

кода:
MainActivity.java

public class MainActivity extends ActionBarActivity {

    Toolbar mActionBarToolbar;

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

        mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);            
        mActionBarToolbar.setTitle("My title");
        setSupportActionBar(mActionBarToolbar);
}

activity_main.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar            
        android:id="@+id/toolbar_actionbar"
        android:background="@null"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize"
        android:fitsSystemWindows="true" />

</LinearLayout>

Но вместо «Мой заголовок» на Панели инструментов% отображается имя приложения%.
Похоже, setTitleметод не имеет никакого эффекта.
Я хотел бы показать «Мой титул».

UPD: раньше styles.xmlбыло:

<style name="AppTheme" parent="Theme.AppCompat">
    <item name="windowActionBar">false</item>
</style>

Итак, я подумал, что actionbar не используется. Я добавляю NoActionBarв стиль parent:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowActionBar">false</item>
</style>

Но проблема не решена.


4
FWIW, я на уровне API 22, и у меня была та же проблема при вызове setTitle после вызова setSupportActionBar, но это работало, если раньше вызывал setTitle . Как описано в ответе ниже, после вызова setSupportActionBar панель действий становится владельцем панели инструментов, и вызовы непосредственно на панели инструментов могут не работать. Я понимаю , что в вашем вопросе вы сделали на самом деле вызов SETTITLE перед тем setSupportActionBar, так что, вероятно , это то , что изменилось в последнее время . В любом случае, использование getSupportActionBar (). SetTitle работает так же хорошо.
JHH

Тот же запрос задан в stackoverflow.com/questions/15560904/…
JoboFive

Попробуйте - «Как установить заголовок для Activity с ToolBar?» link.medium.com/cGVg3zVr0Z
Вердер

Ответы:


560

Нашел решение:

Вместо того:

mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);            
mActionBarToolbar.setTitle("My title");
setSupportActionBar(mActionBarToolbar);

Я использовал:

mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);            
setSupportActionBar(mActionBarToolbar);
getSupportActionBar().setTitle("My title");

И это работает.


27
хороший, но не имеет смысла работать таким образом, а не другим .... добро пожаловать на android 101
DoruChidean

28
getSupportActionBar().setTitle("My title");может создавать
исключение

8
@PratikButani Пока панель инструментов установлена ​​как setSupportActionBar () перед вызовом getSupportActionBar (), почему это может быть?
Леон

3
Ага, легко решаемо: assert getSupportActionBar ()! = Null;
Леон

10
Ребята, вы действительно проголосовали за комментарий @PratikButani столько раз? Если вы используете тему стиля без панели действий, но настраиваемую панель инструментов поддержки v7, и вы забыли позвонить, setSupportActionBar(mToolbar)конечно, вы получите нулевое исключение, но если вы вызвали его, просто проигнорируйте это сообщение. Просто прочитайте - developer.android.com/training/appbar/setting-up.html
25

115

Если вы хотите настроить заголовок через панель инструментов через некоторое время после установки SupportActionBar, прочтите это.

Внутренняя реализация библиотеки поддержки просто проверяет, имеет ли панель инструментов заголовок (не ноль) в момент установки SupportActionBar. Если есть, то этот заголовок будет использоваться вместо заголовка окна. Затем вы можете установить фиктивный заголовок при загрузке реального заголовка.

mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
mActionBarToolbar.setTitle("");
setSupportActionBar(mActionBarToolbar);

потом...

mActionBarToolbar.setTitle(title);

Это работает, но почему это так, как это должно быть сделано, для меня не имеет смысла. У кого-нибудь есть объяснение, почему это работает?
Максвелл

1
@Maxwell Имеет смысл рассмотреть дизайн взаимодействия панели действий / панели инструментов. Активность должна отображать заголовок, если вы предоставляете панель инструментов без этого заголовка, android предполагает, что вам нужен традиционный элемент управления заголовком Активности.
Дрю

1
mActionBarToolbar.setTitle (. GetResources () GetString (R.string.app_name)); обеспечит хорошее название по умолчанию, сохраняя при этом тот же волшебный эффект ответа
Эслам Самех Ахмед

@Bevor это работает, просто посмотрите, сколько голосов этот ответ ... вы просто что-то сделали не так
user25

@ user25, у меня тоже плохо получилось, убрал стрелку назад. Тогда я нашел другое решение: stackoverflow.com/a/40571324/2914140 . this.setTitle("Title")где this- ссылка на вид деятельности.
CoolMind

80

Приведенный выше ответ полностью верен, но не работает для меня.

Я решил свою проблему с помощью следующих вещей.

На самом деле мой XML такой:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/confirm_order_mail_layout"
    android:layout_width="match_parent"
    android:layout_height="fill_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/confirm_order_appbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/confirm_order_list_collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|enterAlways">

            <android.support.v7.widget.Toolbar
                android:id="@+id/confirm_order_toolbar_layout"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

            </android.support.v7.widget.Toolbar>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

Я перепробовал все варианты, и в конце концов я только что удалил, CollapsingToolbarLayoutпотому что мне не нужно использовать в этом конкретном случае, XMLтак что мой окончательный XML выглядит так:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/confirm_order_mail_layout"
    android:layout_width="match_parent"
    android:layout_height="fill_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/confirm_order_appbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/confirm_order_toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

        </android.support.v7.widget.Toolbar>
    </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

Теперь вы должны использовать setTitle()как ответ выше:

mActionBarToolbar = (Toolbar) findViewById(R.id.confirm_order_toolbar_layout);            
setSupportActionBar(mActionBarToolbar);
getSupportActionBar().setTitle("My Title");

Теперь если вы хотите использовать CollapsingToolbarLayoutи Toolbarвместе , то вы должны использовать setTitle()вCollapsingToolbarLayout

CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.confirm_order_mail_layout);
collapsingToolbarLayout.setTitle("My Title");

Пусть это поможет вам. Спасибо.


1
Это имеет смысл, устраняя CollapsingToolbarLayout
решенную

2
У меня работает трюк с настройкой заголовка для CollapsingToolbarLayout. Большое спасибо!
mysliwiec_tech

Могу ли я изменить субтитры с помощью CollapsingToolbarLayout?
nrofis

2
Поскольку ваша панель инструментов вложена в CollapsingToolbarLayout, она переопределяется сворачиванием макета панели инструментов. Это работает для меня.
neilQ5

2
Братан ты спас мне жизнь !!! Вы должны оба установить setSupportActionbar, прежде чем использовать collapsingToolbarLayout.seTitle ("Title");
Джеки Чонг

35

Просто вы можете изменить любое имя активности с помощью

Acitivityname.this.setTitle("Title NAme");

1
Или просто title = "Title"в Котлине или, может быть, this.setTitle("Title")на Яве.
CoolMind

33

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

 <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:title="some title"
        app:popupTheme="@style/AppTheme.PopupOverlay">

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

15

Чтобы установить заголовок для каждого заголовка фрагмента Navbar

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    myView = inflater.inflate(R.layout.second_layout, container, false);
    getActivity().setTitle("title");

    return myView;
}

12

Попробуйте это .. этот метод работает для меня .. !! надеюсь, что это может помочь кому-то .. !!

<android.support.v7.widget.Toolbar  
 xmlns:app="http://schemas.android.com/apk/res-auto"  
 android:id="@+id/my_awesome_toolbar"  
 android:layout_width="match_parent"  
 android:layout_height="wrap_content"  
 android:background="?attr/colorPrimary"  
 android:minHeight="?attr/actionBarSize"  
 app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" >  

<TextView  
   android:id="@+id/toolbar_title"  
   android:layout_width="wrap_content"  
   android:layout_height="wrap_content"  
   android:gravity="center"  
   android:singleLine="true"  
   android:text="Toolbar Title"  
   android:textColor="@android:color/white"  
   android:textSize="18sp"  
   android:textStyle="bold" />  

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

Чтобы отобразить логотип на панели инструментов, попробуйте следующий фрагмент. // Устанавливаем рисование

toolbar.setLogo(ContextCompat.getDrawable(context, R.drawable.logo));

Дайте мне знать результат.


Спасибо, Рагу Сваминатан. Я пытался реализовать SupportActionBar из appcompact Activity, чтобы дать название своей деятельности, но не смог сделать это, потому что мне нужно расширить BaseGameActivity. Затем я иду на панель инструментов, но название не отображается во время работы. Ваш метод с использованием текстового поля внутри панели инструментов работает. Рекомендовать это людям, находящимся в такой же ситуации
Sarun1001

На панели инструментов есть метод для установки логотипа приложения. проверьте мой обновленный ответ
Рагу Сваминатан

11
 getSupportActionBar().setTitle("Your Title");

2
Этот ответ является заглушкой и скорее должен быть комментарием , поскольку такие короткие ответы можно считать низкокачественными. Как только у вас будет достаточно репутации, вы сможете комментировать. Если у вас недостаточно репутации, прочитайте этот пост о том, как внести свой вклад, если у вас еще недостаточно репутации.
присяга

@ascripter это ответ
Джемшит Искендеров

8

См. Https://code.google.com/p/android/issues/detail?id=77763 . Видимо, это должно работать так. После вызова вызова setSupportActionBar()метода делегат ActionBar отвечает за направление вызова в правильное представление.


1
Что это за делегат Actionbar? Здесь setTitle () не работает ни для панели инструментов, ни для поддержки панели действий. Родная панель действий отключена в теме. Что, черт возьми, не так? Если бы в Android Studio работало только вложение исходного кода, я мог бы сам отследить проблему!
WindRider

6

Я пытался переименовать панель инструментов из фрагмента

Это помогло мне, я надеюсь помочь кому-то еще

Activity activity = this.getActivity();
Toolbar toolbar = (Toolbar) activity.findViewById(R.id.detail_toolbar);
        if (toolbar != null) {
            activity.setTitle("Title");
        }

//toolbar.setTitle("Title"); did not give the same results

Скриншот: введите описание изображения здесь


6

Это не только о .setTitle

другие методы поддержки панели инструментов (Appcompat v7) onCreateработают только с

getSupportActionBar().method()

и не работать с mToolbar.method()

Примеры:

getSupportActionBar().setTitle("toolbar title");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

хотя следующие методы работы штрафа не getSupportActionBar()вonCreate

mToolbar.setVisibility(View.VISIBLE);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //
    }

Проблема только с onCreateсобытием, вы все равно можете использовать mToolbar.setTitle()позже, вместо того, чтобы раздражать getSupportActionBar().setTitle(), например, если вы добавите это в onCreateнего будет работать (потому что он будет выполнен позже, после onCreate)

mHandler.post(new Runnable() {
    @Override
    public void run() {
        mToolbar.setTitle("toolbar title");
    }
});

Я предпочитаю использовать это решение https://stackoverflow.com/a/35430590/4548520, чем https://stackoverflow.com/a/26506858/4548520, потому что если вы меняете заголовок много раз (в разных функциях), его удобнее использовать mToolbar.setTitle()чем длиннее, getSupportActionBar().setTitle()и вы не увидите раздражающее уведомление о нулевом исключении, как сgetSupportActionBar().setTitle()


если вы хотите изменить заголовок много раз и, используя свертывающуюся панель инструментов, это поможет: stackoverflow.com/questions/26486730/…
user1506104

6

Для тех, кому нужно настроить заголовок через панель инструментов через некоторое время после установки SupportActionBar (@sorianiv) и вы находитесь Toolbarвнутри a CollapsingToolbarLayout, прочитайте это:

mToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.toolbar_layout);
Toolbar toolbar = findViewById(R.id.toolbar);
//toolbar.setTitle(""); // no need to do this
//mToolbarLayout.setTitle("Title"); // if you need an initial title, do this instead
setSupportActionBar(toolbar);

Тогда позже,

mToolbarLayout.setTitle("New Title");

5

Заголовок приложения не будет отображаться в качестве заголовка по умолчанию для каждого действия, вы можете вставить разные заголовки для каждого действия. В вашем файле активности ниже onCreate просто вставьте одну строку, чтобы установить заголовок,

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("Your Title Here");

Просто измените текст «Ваше название здесь» на ваш текст.


4

Просто используйте это в своем адаптере, где MainActivity - это ваша AppCompactActivity. Звони из любой точки.

((MainActivity) context).getSupportActionBar().setTitle(titles.get(position));

4

Я сделал это с помощью -

toolbar.post(new Runnable() {
            @Override
            public void run() {
                toolbar.setTitle("My Title");
            }
        });

1
Вам не нужно использовать, postесли вы меняете заголовок в потоке пользовательского интерфейса, что, я думаю, составляет 90% случаев.
Вадим Котов

3

Если вы используете CollapsibleToolbarLayoutвместе с, Toolbarто вам нужно будет установить заголовок в обоих макетах

установить панель инструментов как панель действий в onCreateметоде

protected void setUpToolBar() {

    if (mToolbar != null) {
        ((HomeActivity) getActivity()).setSupportActionBar(mToolbar);
        mToolbar.setTitleTextColor(Color.WHITE);
        mToolbar.setTitle("List Detail");
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getActivity()
                        .getSupportFragmentManager().popBackStack();
            }
        });
        ((HomeActivity) getActivity()).getSupportActionBar()
                .setDisplayHomeAsUpEnabled(true);
    }
}

Позже просто обновите заголовок панели инструментов, используя setTitleметод

 mToolbar .setTitle(productFromShoppingList.getProductName()); 
 mCollapsingToolbar.setTitle(productFromShoppingList.getProductName());

Это решение работает, если вы обнаружите, что можете установить заголовок один раз, но не можете изменить его после этого. Убедитесь, что вы устанавливаете заголовок сворачивающейся панели инструментов.
Hylianpuffball

если вы хотите изменить заголовок через некоторое время с помощью сворачивающейся панели инструментов, вы можете сделать это: stackoverflow.com/questions/26486730/…
user1506104

2

Попробуй это:

XML-код

<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="120dp"
    android:id="@+id/tool_bar"
    android:background="@color/tablayout"
    android:theme="@style/ToolBarStyle"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        android:layout_gravity="center"
        android:id="@+id/toolbar_title"
        android:textSize="18sp"
        android:textColor="@color/white"/>
    </android.support.v7.widget.Toolbar>

Java-код

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    toolbar = (Toolbar) findViewById(R.id.tool_bar);
    toolbar_text = (TextView)findViewById(R.id.toolbar_title);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    toolbar.setLogo(R.drawable.ic_toolbar);
}

2

Если ваша цель - установить статическую строку на панели инструментов, самый простой способ сделать это - просто установить метку активности в AndroidManifest.xml:

<activity android:name=".xxxxActivity"
          android:label="@string/string_id" />

Панель инструментов получит эту строку без кода. (работает для меня с библиотеками v27.)


2

У меня странное поведение, которое может вам помочь.
Это работает, но не влияет только на onCreate:

toolbar.setTitle("title");

Попробуйте использовать это в onCreate:

yourActivityName.this.setTitle("title")

2

Чтобы изменить заголовок для каждого отдельного действия

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pizza);
    setTitle(getResources().getText(R.string.title));
}

SetTitle (R.string.title); Событие проще, но не работает
toshkinl

2
 public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       //custom toolbaar
       getSupportActionBar().setTitle("Abhijeet");

    }
}

1

Хотя это не относится непосредственно к этой конкретной настройке, я обнаружил, что удаление «CollapsingToolbarLayout» из моего XML, который оборачивал мою панель инструментов внутри AppBarLayout, заставляло все работать.

Итак, это:

      <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_height="?attr/actionBarSize"
                app:layout_scrollFlags="scroll|enterAlways"
                app:navigationIcon="@drawable/ic_arrow_back_white_24dp" />

        </android.support.design.widget.AppBarLayout>

Вместо этого:

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/collapsingToolbar"
                android:minHeight="?attr/actionBarSize"
                app:layout_scrollFlags="enterAlways|scroll|snap">

                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_height="?attr/actionBarSize"
                    app:navigationIcon="@drawable/ic_arrow_back_white_24dp" />
            </android.support.design.widget.CollapsingToolbarLayout>

        </android.support.design.widget.AppBarLayout>

Затем я устанавливаю заголовок в onCreate действия, прежде чем вызывается setSupportActionBar ().


Вы могли бы сделать это. если вам действительно нужна
свернутая

@Chantell Osejo это тоже сработало для меня, даже я использовал ту же раскладку. Спасибо
Парамжит Сингх Рана

1

Это можно сделать, установив android:labelатрибут вашей активности в AndroidManifest.xmlфайле:

<activity android:name="my activity"
 android:label="The Title I'd like to display" />

И затем добавьте эту строку в onCreate ():

getSupportActionBar().setDisplayShowTitleEnabled(true);

0

Убедитесь, что вы добавили эту опцию:

getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE);

0

Ответ находится в документации (которую вы можете найти здесь ):

Чтобы использовать служебные методы ActionBar, вызовите метод действия getSupportActionBar (). Этот метод возвращает ссылку на объект ActionBar appcompat. Получив эту ссылку, вы можете вызвать любой из методов ActionBar для настройки панели приложения. Например, чтобы скрыть панель приложения, вызовите ActionBar.hide ().

Это решение, которое вы на самом деле нашли. Просто подумал дать ссылку на официальную документацию (которую, видимо, мало кто читает).


0

В Kotlin вы можете сделать это:

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar

class SettingsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_settings)

        val toolbar = findViewById<Toolbar>(R.id.toolbar)
        setSupportActionBar(toolbar)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        supportActionBar?.setTitle(R.string.title)

    }

    override fun onSupportNavigateUp() = true.also { onBackPressed() }

}

-2

Это происходит потому, что вы используете и панель инструментов, и панель действий. Теперь, когда вы хотите использовать панель инструментов в качестве панели действий, первое, что вам нужно сделать, это отключить панель действий, предоставляемую декором.

Самый простой способ - расширить тему Theme.AppCompat.NoActionBar.


Извините, я неправильно понял вопрос.
Хареш Чхелана

1
@HareshChhelana Вы отправили ответ, но знаете ли вы, в чем конкретно проблема?
Пареш Майани

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

1
@PareshMayani спасибо за ваш ответ, но это не решает мою проблему. Пожалуйста, проверьте обновленный вопрос
кроссовочкин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.