Отображение стрелки назад на панели инструментов
Я мигрирую из 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