Wyświetl strzałkę wstecz na pasku narzędzi

496

Jestem migracji z ActionBardo Toolbarw mojej aplikacji. Ale nie wiem, jak wyświetlać i ustawiać zdarzenie kliknięcia na Wstecznej strzałce Toolbartak jak ja Actionbar.

wprowadź opis zdjęcia tutaj

Z ActionBardzwonię mActionbar.setDisplayHomeAsUpEnabled(true). Ale nie ma podobnej metody takiej jak ta.

Czy ktoś kiedykolwiek zmierzył się z tą sytuacją i jakoś znalazł sposób na jej rozwiązanie?

Huy Duong Tu
źródło
Co powiesz na stackoverflow.com/a/29809691/1644301
mDroidd
Skorzystaj z przykładu getSupportActionBar () tutaj freakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy
Powiązany post - Jak wyświetlić i ustawić zdarzenie kliknięcia na
Wstecznej strzałce

Odpowiedzi:

900

Jeśli używasz ActionBarActivity, możesz nakazać systemowi Android, aby używał tego Toolbarw ActionBarpodobny sposób:

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

A potem dzwoni do

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

będzie działać. Możesz również użyć tego w dołączonych fragmentach, ActionBarActivitiesmożesz użyć tego w następujący sposób:

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

Jeśli nie używasz ActionBarActivitieslub chcesz uzyskać strzałkę wstecz na Toolbarnie ustawionym jako twój SupportActionBar, możesz użyć następujących czynności:

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

Jeśli używasz android.support.v7.widget.Toolbar, dodaj następujący kod do AppCompatActivity:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
MrEngineer13
źródło
12
Oficjalna ikona Google Material Design repo github.com/google/material-design-icons/blob/master/navigation/...
MrEngineer13
70
Jeśli używasz najnowszej wersji appcompat-v7 (21.0.3 lub nowszej), możesz użyć R.drawable.abc_ic_ab_back_mtrl_am_alpha do rysowania strzałki wstecz, która jest zawarta w bibliotece wsparcia.
Taeho Kim
23
Pamiętaj, że getResources (). GetDrawable (...) jest przestarzały. Zamiast tego należy użyć ContextCompat.getDrawable (kontekst, ...).
Quentin S.
7
Nie działa, nie mogę znaleźć ani R.drawable.abc_ic_ab_back_mtrl_am_alphajednego R.drawable.ic_action_back.
Henrique de Sousa
10
dostać ikonę „z powrotem” z biblioteki wsparcia toolbar.setNavigationIcon(android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material);
Bolein95
215

Widzę wiele odpowiedzi, ale tutaj jest moja, o której wcześniej nie wspomniano. Działa z 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);
}
Vasil Valchev
źródło
3
Działa to tylko po ustawieniu paska narzędzi jako paska działań. Nie dotyczy samodzielnych pasków narzędzi.
Kuffs
20
Głosowanie za onOptionItemSelected()Uzupełnia to, czego MrEngineer13 nie ujął w swojej odpowiedzi.
Atul
2
Dzięki, że to działało dla mnie. Wydaje się być lepszy niż korzystanie z programu do nasłuchiwania kliknięć, tak naprawdę nie dbam o samodzielne paski narzędzi
Mike76,
Jak mogę zmienić kolor strzałki?
Dmitry
Nie potrzebowałem linii w wierszu komentarza „paska narzędzi”, działa dobrze.
Hack06
173

Jest na to wiele sposobów, oto mój ulubiony:

Układ:

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

Czynność:

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

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // back button pressed
        }
    });
Igor Bubelow
źródło
13
użycie atrybutu theme jest znacznie lepsze niż większość innych sugestii w tym pytaniu
Pedro Loureiro
3
zamiast używać setNavigationOnClickListener()możesz dodać case android.R.id.home:wewnątrz 'onOptionsItemSelected () `.
eugene
1
case android.R.id.homenie działało dla mnie. więc po pewnym czasie Twoja odpowiedź zadziałała. dzięki.
deejay,
Jest to najbardziej autentyczne rozwiązanie, zwłaszcza jeśli chcesz użyć domyślnej tylnej ikony systemu Android.
Nauman Aslam
using toolbar.setNavigationOnClickListener {onBackPressed ()}
filthy_wizard
74

możesz użyć metody setNavigationIcon na pasku narzędzi. Dokument Android

mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

mToolBar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handleOnBackPress();
    }
});
Sam
źródło
1
Czy możesz dodać wyjaśnienie do swojej odpowiedzi? Odpowiedzi tylko w kodzie są mile widziane na SO.
honk
1
Uwaga: metoda setNavigationOnClickListener()została dodana do interfejsu API na poziomie 21 i wyższym
Ali Mehrpour
3
R.drawable.abc_ic_ab_back_mtrl_am_alpha już nie ma w obsłudze 23.2.0, zamiast tego użyj zaakceptowanej odpowiedzi.
Milan
25

Jeśli nie chcesz tworzyć niestandardowego Toolbar, możesz to zrobić w ten sposób

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

W Tobie AndroidManifest.xml

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

możesz także oznaczyć android:theme="@style/Theme.AppCompat.Light"to <aplication>tagiem, aby zastosować je do wszystkich działań

wprowadź opis zdjęcia tutaj

Phan Van Linh
źródło
2
Dzięki zaif (item.getItemId() == android.R.id.home)
Adizbek Ergashev
22
    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
        }
    });

I dla API 21+ android:navigationIcon

<android.support.v7.widget.Toolbar
    android:navigationIcon="@drawable/back_arrow"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"/>
Ilya Gazman
źródło
Powinna być zaakceptowana odpowiedź.
Anton Malyshev
17

Użyłem tej metody z Dokumentacji programisty Google :

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

Jeśli otrzymasz wyjątek wskaźnika zerowego, może to zależeć od motywu. Spróbuj użyć innego motywu w manifeście lub użyj tego alternatywnie:

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

Następnie w manifeście, w którym ustawiam aktywność nadrzędną dla bieżącej aktywności:

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

Mam nadzieję, że to Ci pomoże!

Paolo Anghileri
źródło
1
Link do google docs i getSupportActionBar()działał. Dzięki!
Rick
15

Jeśli ty były przy użyciu AppCompatActivityi poszły w dół drogi nie jest używany, ponieważ nie chciał, aby uzyskać automatyczne ActionBar, że zapewnia, ponieważ chcemy, aby oddzielić się z Toolbarpowodu swoich potrzeb Materiał projekt i CoordinatorLayoutczy AppBarLayoutzatem rozważyć to:

Nadal możesz używać AppCompatActivity, nie musisz przestać go używać tylko po to, aby móc użyć <android.support.v7.widget.Toolbar>w xml. Po prostu wyłącz styl paska akcji w następujący sposób:

Po pierwsze, uzyskaj styl z jednego z motywów NoActionBar, który lubisz w swoim styles.xml, użyłem go w ten Theme.AppCompat.Light.NoActionBarsposób:

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

W manifeście aplikacji wybierz właśnie zdefiniowany motyw stylu potomnego:

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

W pliku XML aktywności, jeśli pasek narzędzi jest zdefiniowany w następujący sposób:

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

I to jest ważna część, którą ustaliłeś pasek akcji wsparcia na AppCompatActivity, które rozszerzasz, tak aby pasek narzędzi w twoim pliku xml stał się się paskiem akcji. Uważam, że jest to lepszy sposób, ponieważ możesz po prostu robić wiele rzeczy, na które pozwala ActionBar, takich jak menu, automatyczny tytuł aktywności, obsługa wyboru pozycji itp. Bez uciekania się do dodawania niestandardowych programów obsługi kliknięć itp.

W zastąpieniu onCreate działania wykonaj następujące czynności:

@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);
} 
Dhiraj Gupta
źródło
8
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());
    }
Artemiy
źródło
Możesz użyć retrolambda.
Artemiy
to mam i nie działa. nie mogę tego rozgryźć.
filthy_wizard
7

Prosty i łatwy sposób pokazania przycisku Wstecz na pasku narzędzi

Wklej ten kod w metodzie onCreate

 if (getSupportActionBar() != null){

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

Wklej tę metodę zastępowania poza metodą onCreate

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId()== android.R.id.home) {

        finish();
    }
    return super.onOptionsItemSelected(item);
}
Waheed Sabir
źródło
7

W Kotlinie byłoby

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
}
gprathour
źródło
6

Z łatwością możesz to zrobić.

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

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

Kredyty: https://freakycoder.com/android-notes-24-how-to-add-back-button-at-toolbar-941e6577418e

Euler Tiago
źródło
5

Na AppCompatActivityprzykład możesz to zrobić

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

}
Deweloper
źródło
4

W pliku manifestu dla działania, do którego chcesz dodać przycisk Wstecz, użyjemy właściwości android: parentActivityName

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

PS Ten atrybut został wprowadzony na poziomie API 16.

Sunny Kumar Aditya
źródło
3

To działało idealnie

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
            }
        });
    }
}
Vikash Sharma
źródło
3

Najpierw musisz zainicjować pasek narzędzi:

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

następnie wywołaj przycisk Wstecz z paska akcji:

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

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
Anubhav
źródło
2

Jeśli chcesz wyświetlić strzałkę wstecz na pasku narzędzi, który nie jest ustawiony jako pasek SupportActionBar:

(kotlin)

val resId = getResIdFromAttribute(toolbar.context, android.R.attr.homeAsUpIndicator)
toolbarFilter.navigationIcon = ContextCompat.getDrawable(toolbar.context, resId)
toolbarFilter.setNavigationOnClickListener { fragmentManager?.popBackStack() }

aby uzyskać res z atrybutów:

@AnyRes
fun getResIdFromAttribute(context: Context, @AttrRes attr: Int): Int {
    if (attr == 0) return 0
    val typedValueAttr = TypedValue()
    context.theme.resolveAttribute(attr, typedValueAttr, true)
    return typedValueAttr.resourceId
}
Jan
źródło
1

Dodaj to do xml działania w folderze układu:

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

Ustaw klikalny pasek narzędzi, dodaj je do metody 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();
    }
});
Yang
źródło
1

Prawdopodobnie bardziej niezawodny sposób na uzyskanie ikony w górę z motywu (jeśli nie używasz paska narzędzi jako paska akcji):

toolbar.navigationIcon = context.getDrawableFromAttribute(R.attr.homeAsUpIndicator)

Aby zmienić atrybut motywu na rysunkowy, użyłem funkcji rozszerzenia:

fun Context.getDrawableFromAttribute(attributeId: Int): Drawable {
    val typedValue = TypedValue().also { theme.resolveAttribute(attributeId, it, true) }
    return resources.getDrawable(typedValue.resourceId, theme)
}
Danwilkie
źródło
0

Jeśli używasz DrawerLayout z ActionBarDrawerToggle , a następnie, aby wyświetlić przycisk Wstecz zamiast przycisku Menu (i viceversa), musisz dodać ten kod do działania:

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

Więc jeśli chcesz pokazać przycisk Wstecz zamiast przycisku Menu , wywołaj showBackInToolbar (true) , a jeśli potrzebujesz przycisku Menu , wywołaj showBackInToolbar (false) .

Możesz wygenerować strzałkę wstecz (ic_arrow_back_white_32dp) tutaj , wyszukaj arrow_back w sekcji Clipart (użyj domyślnej 32dp z wypełnieniem 8dp). Po prostu wybierz żądany kolor.

Borzh
źródło
0

Zawsze można dodać Relative layoutlub Linear Layoutw twojej Toolbari umieścić widok zdjęcie ikonę plecy lub ikonę Zamknij gdziekolwiek w pasku jak chcesz

Na przykład użyłem układu względnego na pasku narzędzi

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

I wygląda to tak:

wprowadź opis zdjęcia tutaj

Możesz dodać detektor kliknięć do tego widoku obrazu z działania lub fragmentu w ten sposób.

  closeMyFlix.setOnClickListener({
            Navigator.instance.showFireTV(  activity!!.supportFragmentManager)
        })
Hitesh Sahu
źródło
0

Z Kotlin stał się:

Xml:

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

W Twojej działalności: -

setSupportActionBar(tbSignToolbar as Toolbar?)//tbSignToolbar :id of your toolbar 
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
wissem miled
źródło
0

Jeśli korzystasz z nawigacji JetPack.

Oto układ dla MainActivity

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                               xmlns:app="http://schemas.android.com/apk/res-auto"
                                               xmlns:tools="http://schemas.android.com/tools"
                                               android:layout_width="match_parent"
                                               android:layout_height="match_parent"
                                               tools:context=".MainActivity">

<androidx.appcompat.widget.Toolbar
        android:id="@+id/toolBar"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

</androidx.appcompat.widget.Toolbar>

<fragment
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintTop_toBottomOf="@id/toolBar"
        app:layout_constraintBottom_toTopOf="parent"
        app:navGraph="@navigation/nav_graph"/>

Ustaw pasek narzędzi w swojej aktywności, jak poniżej w onCreate () swojej klasy Activity.

val navHostFragment = supportFragmentManager
        .findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment? ?: return

val navController = navHostFragment.findNavController()
val toolBar = findViewById<Toolbar>(R.id.toolBar)
setSupportActionBar(toolBar) // To set toolBar as ActionBar
setupActionBarWithNavController(navController)

setupActionBarWithNavController (navController) W razie potrzeby utworzy przycisk Wstecz na pasku narzędzi i obsługuje funkcję BackButton. Jeśli musisz napisać funkcję CustomBack, utwórz metodę callBack, jak poniżej, w swojej metodzie onCreate ()

val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
        // Handle the back button event
    }

Z dokumentacji: https://developer.android.com/guide/navigation/navigation-custom-back

Prakash
źródło
0

Jeśli używasz androidx.appcompat.app.AppCompatActivitytylko użyj:

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Następnie po prostu zdefiniuj w Manifest.xmldziałaniu nadrzędnym.

<activity
    android:name=".MyActivity"
    ...>
  <meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".ParentActivity" />
</activity>

Zamiast tego, jeśli używasz a Toolbari chcesz niestandardowego zachowania, po prostu użyj:

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar" 
    app:navigationIcon="?attr/homeAsUpIndicator"
    .../>

oraz w Twojej działalności:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //....
    }
});
Gabriele Mariotti
źródło