No aplicativo Android, o método Toolbar.setTitle não tem efeito - o nome do aplicativo é mostrado como título


298

Estou tentando criar um aplicativo simples usando a biblioteca android-support-v7: 21. Trechos de

código:
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>

Mas, em vez de "Meu título" na barra de ferramentas% application name% é mostrado.
Parece que o setTitlemétodo não tem efeito.
Eu gostaria de mostrar "Meu título".

UPD: Antes, styles.xmlera:

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

Então, eu pensei que a barra de ação não é usada. Eu adiciono NoActionBarao estilo pai:

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

Mas o problema não está resolvido.


4
FWIW, estou no api nível 22 e tive o mesmo problema ao chamar setTitle depois de chamar setSupportActionBar, mas funcionou se chamar setTitle antes . Conforme descrito em uma resposta abaixo, depois de chamar setSupportActionBar, a barra de ação assume a propriedade da barra de ferramentas e as chamadas diretamente na barra de ferramentas podem não funcionar. Percebo que, na sua pergunta, você realmente chamou setTitle antes de setSupportActionBar, portanto, provavelmente isso foi algo que mudou recentemente. De qualquer forma, o uso de getSupportActionBar (). SetTitle também funciona.
JHH

A mesma consulta solicitada em stackoverflow.com/questions/15560904/…
#

Experimente - "Como definir um título para Atividade com a Barra de Ferramentas?" link.medium.com/cGVg3zVr0Z
Werder

Respostas:


559

Encontrou a solução:

Ao invés de:

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

Eu usei:

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

E isso funciona.


27
nice one, mas não faz sentido para trabalhar desta forma e não o outro .... bem-vindo ao android 101
DoruChidean

28
getSupportActionBar().setTitle("My title");pode produzir 'java.lang.NullPointerException'
Pratik Butani 15/15

8
@PratikButani Desde que a Barra de Ferramentas tenha sido definida como setSupportActionBar () antes de chamar getSupportActionBar (), por que pode?
Leon

3
Ah, resolvido facilmente: assista getSupportActionBar ()! = Null;
Leon

10
Caras, vocês realmente votaram no @PratikButani comentando tantas vezes? Se você usar o tema de estilo sem barra de ação, mas a barra de ferramentas de suporte personalizado v7 e se esquecer de ligar setSupportActionBar(mToolbar), é claro que receberá uma exceção nula, mas se você o chamou, ignore esta mensagem. Basta ler - developer.android.com/training/appbar/setting-up.html
user25 20/18

115

Para quem precisar configurar o título pela barra de ferramentas algum tempo depois de configurar o SupportActionBar, leia isto.

A implementação interna da biblioteca de suporte apenas verifica se a Barra de Ferramentas possui um título (não nulo) no momento em que a SupportActionBar está configurada. Se houver, esse título será usado em vez do título da janela. Você pode definir um título fictício enquanto carrega o título real.

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

mais tarde...

mActionBarToolbar.setTitle(title);

Funciona, mas por que é assim que deve ser feito não faz sentido para mim. Alguém tem uma explicação de por que isso funciona?
Maxwell

1
@ Maxwell Faz sentido considerando o design da interação barra de ação / barra de ferramentas. A Atividade deve exibir um título; se você fornecer uma barra de ferramentas sem esse título, o Android assume que deseja o controle tradicional do título da Atividade.
Desenhou

1
mActionBarToolbar.setTitle (getResources (). getString (R.string.app_name)); vai garantir que há um bom título padrão, mantendo o mesmo efeito mágico da resposta
Eslam Sameh Ahmed

@Bevor ele funciona, basta ver quantos votos esta resposta tem ... você fez algo errado
USER25

@ user25, também funcionou mal para mim, removeu uma seta para trás. Então eu encontrei outra solução: stackoverflow.com/a/40571324/2914140 . this.setTitle("Title"), onde this- é uma referência a uma atividade.
CoolMind 27/01/19

80

A resposta acima é totalmente verdadeira, mas não está funcionando para mim.

Resolvi meu problema com as seguintes coisas.

Na verdade, meu XML é assim:

<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>

Eu tentei todas as opções e, afinal, acabei de remover CollapsingToolbarLayoutporque não preciso usar nesse particular. XMLEntão, meu XML final é como:

<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>

Agora você tem que usar setTitle()como a resposta acima:

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

Agora, se você quiser usar CollapsingToolbarLayoute Toolbarjuntos, então você tem que usar setTitle()deCollapsingToolbarLayout

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

Que isso o ajude. Obrigado.


1
Isso faz sentido, removendo a CollapsingToolbarLayoutresolvido o problema
blueware

2
Para mim, o truque com a definição do título para CollapsingToolbarLayout funciona. Muito obrigado!
mysliwiec_tech

Posso mudar a legenda com CollapsingToolbarLayout?
Nrofis 30/03

2
Como a barra de ferramentas está aninhada em CollapsingToolbarLayout, ela é substituída pelo recolhimento do layout da barra de ferramentas. Isso funciona para mim.
NeilQ5

2
Bro você salva minha vida !!! Você deve setSupportActionbar antes de usar collapsingToolbarLayout.seTitle ("Title");
21418 Jacky Chong

35

Simplesmente você pode alterar qualquer nome de atividade usando

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

1
Ou simplesmente title = "Title"no Kotlin ou talvez this.setTitle("Title")em Java.
CoolMind 27/01/19

33

Tente isso, você pode definir o título diretamente no 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">

O mais fácil, mas ainda eu preciso títulos personalizados de forma dinâmica, se você tem alguma idéia
aya salama

15

Para definir o título para cada título do fragmento 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

Tente isso .. esse método funciona para mim .. !! espero que ajude alguém .. !!

<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>  

Para exibir o logotipo na barra de ferramentas, tente o trecho abaixo. // Definir drawable

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

Deixe-me saber o resultado.


Obrigado Ragu Swaminathan .. Eu estava tentando implementar o SupportActionBar da atividade appcompact para dar um título à minha atividade, mas incapaz de fazê-lo, porque eu preciso estender o BaseGameActivity. Então eu vou para a barra de ferramentas, mas o título não é exibido durante a execução. Seu método usando a caixa de texto na barra de ferramentas está funcionando. Recomendar a pessoas em mesma situação
Sarun1001

A barra de ferramentas possui um método para definir o logotipo do aplicativo. verifique minha resposta atualizada
Ragu Swaminathan

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

2
Esta resposta é um esboço e deveria ser um comentário , pois respostas curtas como essa podem ser consideradas de baixa qualidade. Depois de ter reputação suficiente, você poderá comentar. Se você não tiver reputação suficiente, leia esta postagem sobre como contribuir, se ainda não tiver reputação suficiente.
ascripter

@ascripter é uma resposta
Jemshit Iskenderov

8

Consulte https://code.google.com/p/android/issues/detail?id=77763 . Aparentemente, deveria funcionar assim. Depois que você chama a chamada de setSupportActionBar()método, é de responsabilidade do delegado da ActionBar encaminhar a chamada para a exibição correta.


1
O que é esse delegado da Actionbar? Aqui, setTitle () não funciona na barra de ferramentas nem na barra de ação de suporte. A barra de ação nativa está desativada no tema. O que diabos está errado? Se apenas o anexo do código-fonte funcionasse no Android Studio, eu mesmo poderia rastrear o problema!
WindRider

6

Eu tentei renomear a barra de ferramentas do fragmento

Isso me ajudou, espero ajudar outra pessoa

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

Captura de tela: insira a descrição da imagem aqui


6

Não é apenas sobre .setTitle

mais métodos da Barra de ferramentas de suporte (Appcompat v7) onCreatefuncionam apenas com

getSupportActionBar().method()

e não trabalhe com mToolbar.method()

exemplos:

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

embora próximos métodos funciona bem, sem getSupportActionBar()noonCreate

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

Problema apenas com onCreateevento, você ainda pode usar mToolbar.setTitle()mais tarde, em vez de irritante getSupportActionBar().setTitle(), por exemplo, se você adicionar isso, onCreateele funcionará (porque será executado mais tarde, depois onCreate)

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

Prefiro usar esta solução https://stackoverflow.com/a/35430590/4548520 do que https://stackoverflow.com/a/26506858/4548520 porque se você alterar o título várias vezes (em diferentes funções), é mais confortável usar mToolbar.setTitle()mais de getSupportActionBar().setTitle()um e você não vê uma notificação irritante sobre exceção nula, como acontece comgetSupportActionBar().setTitle()


se você quiser alterar o título várias vezes e usando uma barra de ferramentas
recolhida

6

Para quem precisar configurar o título pela barra de ferramentas algum tempo depois de configurar o SupportActionBar (@sorianiv) E você Toolbarestiver dentro de um CollapsingToolbarLayout, leia o seguinte:

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);

Então depois,

mToolbarLayout.setTitle("New Title");

5

O título do aplicativo não será exibido como título padrão em todas as atividades. Você pode inserir um título diferente em todas as atividades. No arquivo de atividades abaixo do onCreate, basta colar uma única linha para definir o título,

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

Basta alterar o texto "Your Title Here" para o seu texto.


4

Simplesmente use isso no seu adaptador, Onde MainActivity é sua AppCompactActivity. Ligue de qualquer lugar.

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

4

Eu fiz funcionar usando -

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

1
Você não precisa usá- postlo se estiver alterando o título no thread da interface do usuário, que acho que é 90% dos casos.
Vadim Kotov

3

Se você estiver usando CollapsibleToolbarLayoutjunto Toolbar, precisará definir o título nos dois layouts

defina sua barra de ferramentas como barra de ação no onCreatemétodo

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);
    }
}

Mais tarde, basta atualizar o título da barra de ferramentas usando o setTitlemétodo

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

Esta solução funciona se você descobrir que pode definir o título uma vez, mas não pode alterá-lo depois disso. Certifique-se de definir o título da barra de ferramentas recolhida.
Hylianpuffball

se você quiser alterar o título após algum tempo com a barra de ferramentas
recolhida

2

Tente o seguinte:

Código 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>

Código 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

Se seu objetivo é definir uma sequência estática na barra de ferramentas, a maneira mais fácil de fazer isso é simplesmente definir o rótulo da atividade no AndroidManifest.xml:

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

A barra de ferramentas receberá essa sequência sem nenhum código. (funciona para mim com as bibliotecas da v27.)


2

Eu tenho um comportamento estranho que pode ajudá-lo.
Isso está funcionando, mas não tem efeito apenas no onCreate:

toolbar.setTitle("title");

Tente usar isso no onCreate:

yourActivityName.this.setTitle("title")

2

Para alterar o título para cada atividade diferente

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

setTitle (R.string.title); Evento mais fácil, mas não funciona
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

Embora não seja imediatamente relevante para essa configuração em particular, descobri que remover "CollapsingToolbarLayout" do XML que estava envolvendo a barra de ferramentas dentro de um AppBarLayout fazia tudo funcionar.

Então, é isso:

      <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>

Em vez disso:

        <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>

Em seguida, defino o título no onCreate da atividade, antes que setSupportActionBar () seja chamado.


você poderia fazer isso. se você realmente precisa do layout da barra de ferramentas
recolhida

@Chantell Osejo também funcionou para mim, até eu estava usando o mesmo layout. Obrigado
Paramjit Singh Rana

1

Isso pode ser feito configurando o android:labelatributo de sua atividade no AndroidManifest.xmlarquivo:

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

E adicione esta linha ao onCreate ():

getSupportActionBar().setDisplayShowTitleEnabled(true);

0

Certifique-se de adicionar esta opção:

getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE);

0

A resposta está na documentação (que você pode encontrar aqui ):

Para usar os métodos do utilitário ActionBar, chame o método getSupportActionBar () da atividade. Este método retorna uma referência a um objeto ActionBar do appcompat. Depois de ter essa referência, você pode chamar qualquer um dos métodos da ActionBar para ajustar a barra de aplicativos. Por exemplo, para ocultar a barra de aplicativos, chame ActionBar.hide ().

Essa é a solução que você realmente encontrou. Apenas pensei em fazer uma referência à documentação oficial (que aparentemente poucos tendem a ler).


0

No Kotlin, você pode fazer isso:

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

Isso está acontecendo porque você está usando a Barra de ferramentas e a ActionBar. Agora, como você deseja usar a Barra de Ferramentas como uma barra de ação, a primeira coisa a fazer é desativar a barra de ação fornecida pela decoração.

A maneira mais fácil é prolongar o seu tema Theme.AppCompat.NoActionBar.


Desculpe, eu entendi mal a pergunta.
Haresh Chhelana

1
@HareshChhelana Você postou a resposta, mas sabe exatamente qual é o problema?
Paresh Mayani 21/10

Eu acho que está relacionado ao problema de conjunto de barra de ação que você deu a tais ans e quando você me percebe isso eu apaguei meus ans e agora você não se preocupa com meu irmão incompreendido.
Haresh Chhelana

1
@PareshMayani, obrigado pela sua resposta, mas isso não resolve o meu problema. Por favor, verifique a pergunta atualizada
krossovochkin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.