Отображение стрелки назад на панели инструментов
Я мигрирую из ActionBar до Toolbar в моем приложении.
Но я не знаю, как отобразить и установить событие щелчка на Стрелке назад на Toolbar Как я сделал на Actionbar.

С ActionBar, Я называю mActionbar.setDisplayHomeAsUpEnabled(true).
Но нет подобного метода, как этот.
кто-нибудь сталкивался с этой ситуацией и как-то нашел способ ее решить?
13 ответов:
если вы используете
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; }
Я вижу много ответов, но вот мой, который не упоминается ранее. Он работает от 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); }
есть много способов добиться этого, вот мой любимый:
планировка:
<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 } });
вы можете использовать метод 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(); } });
я использовал этот метод от Документация Для Разработчиков Google:
@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>Я надеюсь, что это поможет вам!
если вы не хотите создать пользовательскую
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>тег, для применения ко всем видам деятельности
если вы были используя
AppCompatActivityи пошли по пути не используя его, потому что вы хотели, чтобы не получить автоматическийActionBarчто он обеспечивает, потому что вы хотите отделитьToolbar, из-за ваших материальных потребностей дизайна и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" /> ...тогда, и это важная часть, ты set панель действий поддержки для AppCompatActivity, что вы расширение, так что панель инструментов в вашем XML-файле становится панель действий. Я чувствую, что это лучший способ, потому что вы можете просто делать многие вещи, которые позволяет ActionBar, такие как меню, автоматическое название активности, обработка выбора элементов и т. д. не прибегая к добавлению пользовательских обработчиков щелчков и т. д.
в переопределении onCreate вашей активности выполните следующие действия:
@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); }
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"/>
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()); }
это прекрасно работал
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 } }); } }
в файле манифеста для действия, где вы хотите добавить кнопку назад, мы будем использовать свойство android: parentActivityName
<activity android:name=".WebActivity" android:screenOrientation="portrait" android:parentActivityName=".MainActivity" />П. С. этот атрибут был введен на уровне API 16.
на
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; } }
простой и легкий способ показать кнопку назад на панели инструментов
вставить этот код в метод onCreate
if (getSupportActionBar() != null){ getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); }вставьте этот метод переопределения вне метода onCreate
@Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId()== android.R.id.home) { finish(); } return super.onOptionsItemSelected(item); }

Comments