it-swarm.com.ru

Отобразить стрелку назад на панели инструментов

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

enter image description here

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

Кто-нибудь когда-нибудь сталкивался с такой ситуацией и как-то нашел способ ее решить?

424
Huy Duong Tu

Если вы используете 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;
}
786
MrEngineer13

Я вижу много ответов, но вот мой, который не упоминался ранее. Работает с 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);
}
188
Vasil Valchev

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

Планировка:

<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
        }
    });
140
Igor Bubelov

вы можете использовать панель инструментов метод 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();
    }
});
70
Sam

Если вы не хотите создавать собственное 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

16
Phan Van Linh
    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"/>
16
Ilya Gazman

Я использовал этот метод из Документация разработчика 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>

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

16
Paolo Anghileri

Если вы были использовали 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>

В вашем 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
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);
} 
12
Dhiraj Gupta
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());
    }
7
Artemiy

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

Вставьте этот код в метод 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);
}
6
Waheed Sabir

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

}
5
Developer

Вы можете легко это сделать.

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

Кредиты: https://freakycoder.com/Android-notes-24-how-to-add-back-button-at-toolbar-941e6577418e

5
Euler Tiago

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

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

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

4
Sunny Kumar Aditya

это сработало отлично

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
            }
        });
    }
}
3
Vikash Sharma

В Котлине это было бы

private fun setupToolbar(){
    toolbar.title = getString(R.string.YOUR_TITLE)
    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)
    supportActionBar?.setDisplayShowHomeEnabled(true)
}

// don't forget click listener for back button
override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}
3
gprathour

Добавьте это в xml активности в папке макета:

<Android.support.design.widget.AppBarLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:theme="@style/AppTheme.AppBarOverlay">
    <Android.support.v7.widget.Toolbar
        Android:id="@+id/prod_toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="?attr/actionBarSize"
        Android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />
</Android.support.design.widget.AppBarLayout>

Сделайте панель инструментов кликабельной, добавьте их в метод onCreate:

Toolbar toolbar = (Toolbar) findViewById(R.id.prod_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});
1
Yang

Если вы используете DrawerLayout с ActionBarDrawerToggle , то для показа Кнопка "Назад" вместо кнопки меню (и наоборот), необходимо добавить этот код в вашей деятельности:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.application_name, R.string.application_name);
    mDrawerLayout.addDrawerListener(mDrawerToggle);

    mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_arrow_back_white_32dp);
    mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onBackPressed(); // Or you can perform some other action here when Back button is clicked.
        }
    });
    mDrawerToggle.syncState();
    // ...
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(item))
        return true;

    switch (item.getItemId()) {
        case Android.R.id.home:
            onBackPressed();
            return true;
        // ...
    }

    return super.onOptionsItemSelected(item);
}

public void showBackInToolbar(boolean isBack) {
    // Remove next line if you still want to be able to swipe to show drawer menu.
    mDrawerLayout.setDrawerLockMode(isBack ? DrawerLayout.LOCK_MODE_LOCKED_CLOSED : DrawerLayout.LOCK_MODE_UNLOCKED);
    mDrawerToggle.setDrawerIndicatorEnabled(!isBack);
    mDrawerToggle.syncState();
}

Поэтому, когда вам нужно показать кнопку "Назад" вместо кнопки меню , вызовите showBackInToolbar (true) , и, если вам нужна кнопка меню , вызовите showBackInToolbar (ложь) .

Вы можете создать стрелку назад (ic_arrow_back_white_32dp) здесь , поиск arrow_back в Клипарт раздел (используйте 32dp по умолчанию с отступом 8dp). Просто выберите нужный вам цвет.

0
Borzh

Вы всегда можете добавить Relative layout или Linear Layout в свое Toolbar и разместить изображение в виде значка назад или значка закрытия в любом месте панели инструментов, как вам нравится

Например, я использовал Относительный макет на моей панели инструментов

 <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar_top"
                Android:layout_width="match_parent"
                Android:layout_height="35dp"
                Android:minHeight="?attr/actionBarSize"
                Android:nextFocusDown="@id/netflixVideoGridView"
                app:layout_collapseMode="pin">

                <RelativeLayout
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content">


                    <TextView

                        Android:layout_width="wrap_content"
                        Android:layout_height="wrap_content"
                        Android:text="Myflix"
                        Android:textAllCaps="true"
                        Android:textSize="19sp"
                        Android:textColor="@color/red"
                        Android:textStyle="bold" />


                    <ImageView
                        Android:id="@+id/closeMyFlix"
                        Android:layout_alignParentRight="true"
                        Android:layout_width="wrap_content"
                        Android:layout_height="wrap_content"
                        Android:layout_gravity="center_vertical"
                        app:srcCompat="@drawable/vector_close" />


                </RelativeLayout>

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

И это выглядит так:

enter image description here

Вы можете добавить прослушиватель щелчков на этом изображении из Activity или фрагмента следующим образом.

  closeMyFlix.setOnClickListener({
            Navigator.instance.showFireTV(  activity!!.supportFragmentManager)
        })
0
Hitesh Sahu

С Котлином стало: Xml:

<include Android:id="@+id/tbSignToolbar " layout="@layout/toolbar_sign_up_in"/>

В вашей деятельности:

setSupportActionBar(tbSignToolbar as Toolbar?)//tbSignToolbar :id of your toolbar supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayShowHomeEnabled(true)

0
wissem miled