wake-up-neo.com

Zeigen Sie in der Symbolleiste den Pfeil nach hinten an

Ich migriere von ActionBar nach Toolbar in meiner Anwendung. Aber ich weiß nicht, wie ich ein Klickereignis auf dem Zurückpfeil auf Toolbar anzeigen und einstellen soll, wie ich es auf Actionbar getan habe.

enter image description here

Mit ActionBar rufe ich mActionbar.setDisplayHomeAsUpEnabled(true) auf. Aber es gibt keine ähnliche Methode wie diese.

Hat sich jemals jemand mit dieser Situation auseinandergesetzt und irgendwie einen Weg gefunden, sie zu lösen?

442
Huy Duong Tu

Wenn Sie ein ActionBarActivity verwenden, können Sie Android anweisen, das Toolbar wie folgt als ActionBar zu verwenden:

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

Und ruft dann an

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

wird funktionieren. Sie können dies auch in Fragmenten verwenden, die an ActionBarActivities angehängt sind. Sie können es folgendermaßen verwenden:

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

Wenn Sie ActionBarActivities nicht verwenden oder wenn Sie den Zurück-Pfeil auf einem Toolbar anzeigen möchten, der nicht als Ihr SupportActionBar festgelegt ist, können Sie Folgendes verwenden:

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

Wenn Sie Android.support.v7.widget.Toolbar verwenden, sollten Sie Ihrem AppCompatActivity den folgenden Code hinzufügen:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
807
MrEngineer13

Ich sehe viele Antworten, aber hier ist meine, die vorher nicht erwähnt wurde. Es funktioniert ab 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);
}
194
Vasil Valchev

Es gibt viele Möglichkeiten, das zu erreichen, hier ist mein Favorit:

Layout:

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

Aktivität:

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

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

sie können die Toolbar setNavigationIcon-Methode verwenden. 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();
    }
});
72
Sam

Wenn Sie kein benutzerdefiniertes Toolbar erstellen möchten, können Sie dies tun

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

In dir AndroidManifest.xml

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

sie können dieses Android:theme="@style/Theme.AppCompat.Light" auch auf <aplication> setzen, um es auf alle Aktivitäten anzuwenden

enter image description here

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

Und für 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

Ich habe diese Methode aus der Google Developer Documentation verwendet:

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

Wenn Sie eine Nullzeiger-Ausnahme erhalten, kann dies vom Thema abhängen. Versuchen Sie, ein anderes Thema im Manifest zu verwenden, oder verwenden Sie dies alternativ:

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

Dann im Manifest, wo ich die übergeordnete Aktivität für die aktuelle Aktivität festgelegt habe:

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

Ich hoffe, dies wird dir helfen!

16
Paolo Anghileri

Wenn Sie warenAppCompatActivity verwenden und den Weg gegangen sind, es nicht zu verwenden, weil Sie nicht die automatische ActionBar erhalten wollten, die es bietet, weil Sie trennen möchten die Toolbar, aufgrund Ihrer Materialdesign-Anforderungen und CoordinatorLayout oder AppBarLayout, dann berücksichtigen Sie Folgendes:

Sie können das AppCompatActivity weiterhin verwenden. Sie müssen nicht aufhören, es zu verwenden, damit Sie einen <Android.support.v7.widget.Toolbar> in Ihrer XML-Datei verwenden können. Schalten Sie einfach die Aktionsleiste aus style wie folgt:

Leiten Sie zunächst einen Stil aus einem der NoActionBar-Themen ab, die Sie in Ihrem styles.xml mögen. Ich habe Theme.AppCompat.Light.NoActionBar folgendermaßen verwendet:

<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ählen Sie im Manifest Ihrer App das soeben definierte untergeordnete Stilthema wie folgt aus:

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

Wenn die Symbolleiste in Ihrer Activity Xml wie folgt definiert ist:

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

Dann, und dies ist der wichtige Teil, set ​​die Support-Aktionsleiste für die AppCompatActivity, die Sie erweitern, so dass die Symbolleiste in Ihrer XML zu die Aktionsleiste. Ich bin der Meinung, dass dies eine bessere Möglichkeit ist, da Sie einfach die vielen Möglichkeiten von ActionBar nutzen können, z. B. Menüs, Titel für automatische Aktivitäten, Handhabung der Elementauswahl usw., ohne benutzerdefinierte Klickhandler usw. hinzufügen zu müssen.

Führen Sie in der OnCreate-Überschreibung Ihrer Aktivität die folgenden Schritte aus:

@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

Einfache und einfache Möglichkeit, die Schaltfläche "Zurück" in der Symbolleiste anzuzeigen

Fügen Sie diesen Code in die onCreate-Methode ein

 if (getSupportActionBar() != null){

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

Fügen Sie diese Überschreibungsmethode außerhalb der onCreate-Methode ein

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

        finish();
    }
    return super.onOptionsItemSelected(item);
}
7
Waheed Sabir
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

In der AppCompatActivity können Sie zum Beispiel tun

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

Sie können es leicht tun.

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

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

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

5
Euler Tiago

In Ihrer Manifestdatei für die Aktivität, in der Sie eine Zurück-Schaltfläche hinzufügen möchten, verwenden wir die Eigenschaft Android: parentActivityName

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

P.S. Dieses Attribut wurde in API Level 16 eingeführt.

4

Das hat einwandfrei funktioniert

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

In Kotlin wäre es

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

Fügen Sie dies zur XML-Datei der Aktivität im Layout-Ordner hinzu:

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

Machen Sie die Symbolleiste anklickbar und fügen Sie diese zur onCreate-Methode hinzu:

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

Wenn SieDrawerLayoutmitActionBarDrawerToggleverwenden, zeigen SieZurückbutton anstelle vonMenubutton (und umgekehrt), müssen Sie diesen Code in Ihre Aktivität einfügen:

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

Wenn Sie alsoZurückanstelle vonMenüanzeigen möchten, rufen Sieauf/showBackInToolbar (true), und wenn SieMenubutton benötigen, rufen SieshowBackInToolbar (false)auf /.

Sie können einen Zurück-Pfeil (ic_arrow_back_white_32dp) erstellen hier , suchen arrow_back inClipartsection ( Standard 32dp mit 8dp Auffüllung verwenden). Wählen Sie einfach die gewünschte Farbe.

0
Borzh

Sie können jederzeit einen Relative layout oder einen Linear Layout in Ihr Toolbar einfügen und eine Bildansicht für das Zurück-Symbol oder das Schließen-Symbol an einer beliebigen Stelle in der Symbolleiste platzieren

Zum Beispiel habe ich Relatives Layout in meiner Symbolleiste verwendet

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

Und so sieht es aus:

enter image description here

Sie können in dieser Bildansicht einen Klicklistener aus einer Aktivität oder einem Fragment wie diesem hinzufügen.

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

Mit Kotlin wurde es:

XML:

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

In Ihrer Aktivität: -

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

Wenn Sie den Zurück-Pfeil auf einer Symbolleiste anzeigen möchten, die nicht als SupportActionBar festgelegt ist:

(kotlin)

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

um Res von Attributen zu erhalten:

@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
}
0
John