287

Я перехожу от ActionBar в Toolbar в мое приложение. Но я не знаю, как отображать и устанавливать событие click на Back Arrow на Toolbar, как я сделал на Actionbar.
enter image description hereПоказать стрелку на панели инструментов Android

С ActionBar, я называю mActionbar.setDisplayHomeAsUpEnabled(true). Но подобного метода нет.

Неужели кто-нибудь когда-либо сталкивался с этой ситуацией и каким-то образом нашел способ ее решить?

+0

Как о http://stackoverflow.com/a/29809691/1644301 – mDroidd

ответ

554

Если вы используете ActionBarActivity, то вы можете сказать Android использовать Toolbar как ActionBar например так:

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

А потом звонит

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
getSupportActionBar().setDisplayShowHomeEnabled(true); 

будет работать. Вы также можете использовать это в фрагментах, которые прикреплены к ActionBarActivities вы можете использовать его как это:

((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true); 

Если вы не используете ActionBarActivities или если вы хотите, чтобы получить обратную стрелку на Toolbar, который не указан в качестве SupportActionBar то вы можете использовать следующие:

mActionBar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back)); 
mActionBar.setNavigationOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     //What to do on back clicked 
    } 
}); 

Если вы используете android.support.v7.widget.Toolbar, то вам необходимо добавить следующий код в AppCompatActivity:

@Override 
public boolean onSupportNavigateUp() { 
    onBackPressed(); 
    return true; 
} 
+0

@ MrEngineer13 Откуда вы извлекли ic_action_back? – ZakTaccardi

+12

Официальная информация о дизайне материалов Google repo https://github.com/google/material-design-icons/blob/master/navigation/drawable-xhdpi/ic_arrow_back_black_48dp.png – MrEngineer13

+56

Если вы используете последнюю версию appcompat-v7 (21.0.3 или выше), вы можете использовать R.drawable.abc_ic_ab_back_mtrl_am_alpha для рисования назад стрелки, которая включена в библиотеку поддержки. –

8

Если вы были с помощью AppCompatActivity и пошли по пути он не используется, потому что вы хотите, чтобы не получить автоматическую ActionBar, что она обеспечивает, потому что вы хотите выделить Toolbar, из-за ваших потребностей Material Design и CoordinatorLayout или AppBarLayout, то подумайте:

вы все еще можете использовать AppCompatActivity, вы не должны прекратить использовать его просто так, что вы можете использовать <android.support.v7.widget.Toolbar> в вашем XML.Просто отключить панель действий стиля следующим образом:

Во-первых, получить стиль от одной из того NoActionBar, что вам нравится в вашем styles.xml, я использовал Theme.AppCompat.Light.NoActionBar как так:

<style name="SuperCoolAppBarActivity" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorPrimary">@color/primary</item> 

    <!-- colorPrimaryDark is used for the status bar --> 
    <item name="colorPrimaryDark">@color/primary_dark</item> 
    ... 
    ... 
</style> 

В вашем приложении манифеста, выбрать тему ребенка стиль вы только что определили, например, так:

<activity 
     android:name=".activity.YourSuperCoolActivity" 
     android:label="@string/super_cool" 
     android:theme="@style/SuperCoolAppBarActivity"> 
    </activity> 

в вашей деятельности Xml, если тулбар определяется следующим образом:

... 
    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     /> 
... 

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

В вашем Действие onCreate override, сделайте следующее:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_super_cool); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 

    setSupportActionBar(toolbar); 
    //Your toolbar is now an action bar and you can use it like you always do, for example: 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 
64

вы можете использовать панель инструментов setNavigationIcon метод. Android Doc

mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); 

mToolBar.setNavigationOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     handleOnBackPress(); 
    } 
}); 
+1

Не могли бы вы добавить какое-то объяснение в свой ответ? Кодовые ответы не одобряются на SO. – honk

+1

Обратите внимание, что метод 'setNavigationOnClickListener()' был добавлен в api level 21 и выше –

+2

R.drawable.abc_ic_ab_back_mtrl_am_alpha теперь ушел в поддержку 23.2.0, вместо этого используйте принятый ответ. – Milan

133

Я вижу много ответов, но здесь моя, не упоминалось ранее. Он работает от API 8+.

public class DetailActivity extends AppCompatActivity 

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

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

    // add back arrow to toolbar 
    if (getSupportActionBar() != null){ 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
    } 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // handle arrow click here 
    if (item.getItemId() == android.R.id.home) { 
     finish(); // close this activity and return to preview activity (if there is any) 
    } 

    return super.onOptionsItemSelected(item); 
} 
+1

Это работает, только если вы установите панель инструментов в качестве ActionBar. Это не для отдельных панелей инструментов. – Kuffs

+10

Upvote для 'onOptionItemSelected()' Это завершает то, что MrEngineer13 не рассмотрел в его ответе. – Atul

+1

Спасибо, это сработало для меня. Кажется, что лучше, чем использовать прослушиватель кликов, мне не все равно, что автономные панели инструментов – Mike76

76

Есть много способов достижения этой цели, вот мой любимый:

Планировка:

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    app:navigationIcon="?attr/homeAsUpIndicator" /> 

активность:

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

    toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // back button pressed 
     } 
    }); 
+4

с использованием атрибута темы намного лучше, чем большинство других предложений в этом вопросе –

+0

это просто и просто. Спасибо дружище. +1 –

+2

вместо использования 'setNavigationOnClickListener()' вы можете добавить 'case android.R.id.home:' inside 'onOptionsItemSelected() '. – eugene

2
MyActivity extends AppCompatActivity { 

private Toolbar toolbar; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    toolbar = (Toolbar) findViewById(R.id.my_toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    toolbar.setNavigationOnClickListener(arrow -> onBackPressed()); 
} 
+0

Будет ли это работать только с поддержкой Jack (java 1.8)? –

+0

Вы можете использовать retrolambda. – Artemiy

2

Это работало отлично

public class BackButton extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.chat_box); 
     Toolbar chatbox_toolbar=(Toolbar)findViewById(R.id.chat_box_toolbar); 
     chatbox_toolbar.setTitle("Demo Back Button"); 
     chatbox_toolbar.setTitleTextColor(getResources().getColor(R.color.white)); 
     setSupportActionBar(chatbox_toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     chatbox_toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       //Define Back Button Function 
      } 
     }); 
    } 
} 
7
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    toolbar.setNavigationIcon(R.drawable.back_arrow); // your drawable 
    toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onBackPressed(); // Implemented by activity 
     } 
    }); 

И API 21+ android:navigationIcon

<android.support.v7.widget.Toolbar 
    android:navigationIcon="@drawable/back_arrow" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize"/> 
10

Я использовал этот метод из Google Developer Documentation:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
} 

Если исключения нулевого указателя он может зависеть от тема.Попробуйте использовать другую тему в манифесте или использовать этот альтернативный вариант:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 

Тогда в манифесте, где я установил родительскую активность для текущей деятельности:

<activity 
     android:name="com.example.myapp.MyCurrentActivity" 
     android:label="@string/title_activity_display_message" 
    android:parentActivityName="com.example.myfirstapp.MainActivity" > 
    <!-- Parent activity meta-data to support 4.0 and lower --> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value="com.example.myapp.MyMainActivity" /> 
</activity> 

Я надеюсь, что это поможет!

+0

Это сработало для меня! – Chris

+0

Работала ссылка google docs и 'getSupportActionBar()'. Благодаря! – Rick

+0

Это лучший ответ. Остальные хаки – RileyManda

8

Если вы не хотите, чтобы создать пользовательский Toolbar, вы можете сделать, как этот

public class GalleryActivity extends AppCompatActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     getSupportActionBar().setTitle("Select Image"); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (item.getItemId() == android.R.id.home) { 
      finish(); 
     } 
return super.onOptionsItemSelected(item); 
    } 
} 

В вас AndroidManifest.xml

<activity 
    android:name=".GalleryActivity" 
    android:theme="@style/Theme.AppCompat.Light" 
    >   
</activity> 

вы также можете поместить этот android:theme="@style/Theme.AppCompat.Light" в <aplication> тег, для применять ко всем видам деятельности

enter image description here

+0

Спасибо за 'if (item.getItemId() == android.R.id.home)' –

0

В вашем файле манифеста для деятельности, где вы хотите добавить кнопку назад, мы будем использовать свойство андроида: parentActivityName

 <activity 
     android:name=".WebActivity" 
     android:screenOrientation="portrait" 
     android:parentActivityName=".MainActivity" 
     /> 

P.S. Этот атрибут был введен в уровне API 16.

0

В AppCompatActivity, например, вы можете сделать

public class GrandStatActivity extends AppCompatActivity { 

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

    @Override 
    public void onResume() { 
     super.onResume(); 

     // Display custom title 
     ActionBar actionBar = this.getSupportActionBar(); 
     actionBar.setTitle(R.string.fragment_title_grandstats); 

     // Display the back arrow 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
    } 

    // Back arrow click event to go to the parent Activity 
    @Override 
    public boolean onSupportNavigateUp() { 
     onBackPressed(); 
     return true; 
    } 

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