Android - Başlık çubuğunda Geri düğmesi


112

Pek çok uygulamada (Takvim, Drive, Play Store) bir düğmeye dokunduğunuzda ve yeni bir etkinlik girdiğinizde, başlık çubuğundaki simge bir geri düğmesine dönüşüyor, ancak benim yaptığım uygulama için bunu yapmıyor. Bu simgenin sizi önceki ekrana geri götürmesini nasıl sağlarım?


OnCreate örneğindeki getSupportActionBar () 'ı deneyin burada freakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy

Yanıtlar:


146

Başlık çubuğunda bir geri düğmesi oluşturmanın iki basit adımı vardır:

Öncelikle, başlık çubuğunda bir geri düğmesi olmasını istediğiniz aktivitede aşağıdaki kodu kullanarak uygulama simgesini tıklanabilir hale getirin:

ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

Yukarıdaki kodu ekledikten sonra, uygulama simgesinin solunda bir geri okunun göründüğünü göreceksiniz.

görüntü açıklamasını buraya girin

İkinci olarak, yukarıdakileri yaptıktan sonra, tıklama olayından yararlanacak bir kod yaratmanız gerekir. Bunu yapmak için, uygulama simgesine gerçekten tıkladığınızda bir onOptionsItemSelectedyöntemin çağrıldığını unutmayın. Bu nedenle, önceki etkinliğe geri dönmek için, bu yöntemi etkinliğinize ekleyin ve Intentsizi önceki etkinliğe döndürecek kodu ona yerleştirin . Örneğin, geri dönmeye çalıştığınız aktivitenin çağrıldığını varsayalım MyActivity. Geri dönmek için yöntemi şu şekilde yazın:

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

Bu kadar!

(Android geliştiricileri API'sinde, manifest ile uğraşmanızı ve benzer şeyler eklemenizi önerir android:parentActivityName. Ancak bu benim için işe yaramıyor. Yukarıdakiler daha basit ve daha güvenilir.)

<meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".MainActivity" />

Ve Faaliyetinizde

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

23
İyi açıkladınız, ancak onOptionItemSelected öğenizde yanlış değilse, sadece finish () çağırmalısınız; sizin durumunuzda startActivityForResult ikinci aktiviteyi başlatacak ve ikinci aktiviteden geri bastığınızda, ilk aktiviteye geri atılacaksınız (eylem çubuğu simgesine bastığınız yer)
Yahya Arshad

8
Üstelik, bunu yalnızca item.getItemId () android.R.id.home ise yapmalısınız
bitek

2
AS'nin belirttiği gibi: "Yöntem çağırma 'actionBar.setDisplayHomeAsUpEnabled (true)' java.lang.NullPointerException oluşturabilir"
statosdotcom

1
Uyarı! ToolBar ile actionBar çökme ile null döndürür. Aşağıdaki cevaplara bakın.
CoolMind

5
getActionBar () benim için çalışmadı, sadece uygulama çöküyor. getSupportActionBar () işe yaradı.
john ktejik

60

bu kodu kullan

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

bundan sonra bu kodu onOptionsItemSelectedmetoda yaz

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }

1
getActionBar()bana boş verir; neden biliyor musun?
msysmilu

3
ActionBar olmadığı için, örneğin <item name = "android: windowActionBar"> false </item> <item name = "android: windowNoTitle"> true </item> ile
Paul Verest

48

Sonunda eylem çubuğuna / araç çubuğuna geri düğmesini düzgün bir şekilde eklemeyi başardım

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            return true;
    }

    return super.onOptionsItemSelected(item);
}

public boolean onCreateOptionsMenu(Menu menu) {
    return true;
}

3
Benim için işe yarayan tek cevap bu. Teşekkürler @LucyFair
Arda Çebi

2
Aynı. Cevabınız için teşekkür ederim.
Maria

Aynı. Diğer cevapların hiçbiri işe yaramıyor. Bu kabul edilen cevap olmalıydı.
El Sushiboi

18

1.- Aktiviteyi AndroidManifest.xml'e ekleyin ve meta verileri sağladığınızdan emin olun:

<activity
    android:name="com.example.myfirstapp.DisplayMessageActivity"
    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.myfirstapp.MainActivity" />
</activity>

2.- Aktivitenin onCreate yöntemine aşağıdaki kodu ekleyin:

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

3.- onOptionsItemSelected öğesini geçersiz kılın ve yığını atmak için NavUtils.navigateUpFromSameTask () statik yöntemini kullanın.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Ancak, navigateUpFromSameTask () 'ın kullanılması yalnızca uygulamanız geçerli görevin sahibi olduğunda (yani, kullanıcı bu göreve uygulamanızdan başlattığında) uygundur. Bu doğru değilse ve etkinliğiniz farklı bir uygulamaya ait bir görevde başlatıldıysa, Yukarıya gitmek uygulamanıza ait yeni bir görev oluşturmalıdır, bu da yeni bir arka yığın oluşturmanızı gerektirir.


NavUtils'i tanıttığınız için teşekkürler!
AntonSack

10

Aktiviteniz Aktiviteyi uzatırsa

public class YourActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xxx);

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

Eyleminiz AppCompatActivity'yi genişletirse

public class YourActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_xxx);

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

Hiçbir şey yapmak için daha çok, bak eylemi ekle

[İSTEĞE BAĞLI] Ana etkinliği açıkça tanımlamak için Manifest.xml dosyanızı şu şekilde değiştirin:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.YourActivity "
        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.myfirstapp.MainActivity" />
    </activity>
</application>

Ana Etkinliği Belirleme konusuna bakın


1
Tam olarak aradığım buydu. Günümü kurtardın. Çok teşekkürler.
Tashi Dendup

6

Aktiviteniz genişlerse AppCompatActivity, aşağıdaki onSupportNavigateUp()gibi yöntemi geçersiz kılmanız gerekir :

public class SecondActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_second);
       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       getSupportActionBar().setHomeButtonEnabled(true);
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       ...
   }

   @Override
   public void onBackPressed() {
       super.onBackPressed();
       this.finish();
   }

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

Mantığınızı onBackPressed()yönteminizde kullanın ve bu yöntemi çağırın, onSupportNavigateUp()böylece telefondaki geri düğmesi ve araç çubuğundaki ok aynı şeyi yapar.


6

her şeyden önce onCreate Function'a aşağıdaki satırı ekleyin

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

ve sonra koda aşağıdaki işlevi ekleyin:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

6

Öncelikle bu kodları yazmanız gerekiyor

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

Sonra bu satırı manifest'e ekleyin

 <activity android:name=".MainActivity"
            android:parentActivityName=".PreviousActivity"></activity>

Bence işe yarayacak


5

Android stüdyosunda 5.1 için yeni destek kitaplığını kullanıyorsanız, bunun yerine bunu AppCompatActivity'de kullanabilirsiniz.

 ActionBar actionBar = getSupportActionBar();
 actionBar.setHomeButtonEnabled(true);
 actionBar.setDisplayHomeAsUpEnabled(true);
 actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
 actionBar.setDisplayShowHomeEnabled(true);

şerefe.


5

Google'ın burada açıkladığı gibi en basit yol ve en iyi uygulama :

1. Çocuğunuz için bir ebeveyn ekleyin AndroidManifest.xml:

<activity 
        android:name=".ChildActivity"
        android:parentActivityName=".ParentActivity" >
</activity>

2. Çocuğunuzun etkinliğinde geri düğmesini etkinleştirin:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

Benim için çalıştı, umarım senin için de işe yarar.


bu, yalnızca etkinlik yalnızca bir ana etkinliğe sahipse geçerlidir. Benim için durum bu. +1
MQoder

Benim durumumda 2. adım gerekli değildi.
Thomio

5

Bulduğum kaliteli bir zamandan sonra, tema seçeneği kodumdaki ana sorundur ve aşağıdaki araç çubuğunu benim için göstermenin doğru yoludur

AndroidManifest dosyasında önce tema stilinizi değiştirmeniz gerekir

Theme.AppCompat.Light.DarkActionBar
to 
Theme.AppCompat.Light.NoActionBar

sonra xml etkinliğinizde kendi Araç Çubuğunuzu şöyle çağırmanız gerekir

<androidx.appcompat.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:elevation="4dp"/>

Ve sonra bu araç çubuğu Java dosyanızda şu şekilde çağrılmalıdır:

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

Ve U gösteren araç çubuğu için, NullPointerException'dan kaçınmak için null'u kontrol etmelisiniz

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Ev etkinliği için bunu tekrar ekleyin

@Override
public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId()==android.R.id.home) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

VEYA istediğiniz aktivite için geri

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), YourActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

3

Çok fazla kompleksin cevap verdiğini gördüm, bu yüzden bu benim kodum. Burada çalışıyor. Bunu iki şekilde başarabilirsiniz.

1) Stardard android uyumluluğu

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;

import android.view.MenuItem;
import android.view.View;

public class EditDiscoveryActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_discovery);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        /*toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });*/
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

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

}

2) Özel bir simge kullanın

Kodu yorumlarda kullanmak istiyorsanız, bu dosyayı ic_arrow_white_24dp.xml adlı çekilebilir olarak eklemeniz yeterlidir.

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#ffffff"
        android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    </vector>

Bu kod ile.

toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    finish();
                }
            });

Umarım buradaki bazı insanlara yardımcı olur!


2

Kullanmadan hafif ağırlıklı sürüm ActionBarActivity, burada hala aynı bahaviorlara sahiptir:

public class ToolbarConfigurer implements View.OnClickListener {
    private Activity activity;

    public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
        toolbar.setTitle((this.activity = activity).getTitle());
        if (!displayHomeAsUpEnabled) return;
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        toolbar.setNavigationOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        NavUtils.navigateUpFromSameTask(activity);
    }
}

Kullanımı: Put new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);in onCreate.


Bu, destek kitaplığında bulunan yeni Araç Çubuğu widget'ına uygundur. Teşekkürler!!
Clocker

2

Manifest dosyasına aşağıda belirtilen kodu eklemeniz gerekir. Geri ok işlevini eklemek istediğiniz etkinliği arayın. Birini bulursanız, o zaman tamamlayın veya etkinliği oluşturun

<activity android:name=".SearchActivity">

</activity>

Ardından arasına aşağıdaki üç kod satırını ekleyin.

<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.raqib.instadate.MainActivity" />

Ve bu kod parçasını onCreate () 'e eklemeyi unutmayın; geri okuna ihtiyaç duyduğunuz belirli aktivitenizin yöntemi.

        Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
    setSupportActionBar(toolbar);
    try{
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }catch(NullPointerException e){
       Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
    }

Sorunu bu şekilde çözdüm. Teşekkürler.


2

Diğer yanıtlar, bunu Toolbarwidget'ınızın XML'inde de ayarlayabileceğinizden bahsetmiyor :

app:navigationIcon="?attr/homeAsUpIndicator"

Örneğin:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:navigationIcon="?attr/homeAsUpIndicator"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:title="@string/title_activity_acoustic_progress" />

2

2020'de yapmanız gereken tek şey:
(MainActivity'ye geri dönmek istediğinizi düşünürsek)

protected void onCreate(Bundle savedInstanceState){
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

public boolean onOptionsItemSelected(MenuItem item) {
    Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

Bu ilginç, ancak MainActivity'ye geri dönmek istediğimizi varsayıyorsunuz. Önceki herhangi bir etkinliğe nasıl yönlendirilirsiniz?
mayid


1

Uygulama manifestinde bir ana etkinlik belirtilerek kod olmadan da yapılabilir Etkinlik B'de Etkinlik A'ya gidecek bir geri düğmesi istiyorsanız, bildirime Etkinlik B'nin üst öğesi olarak Etkinlik A'yı eklemeniz yeterlidir.


1

Kotlin için:

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }

1

Benim için doğru cevabı alabilmek için bazı cevapları karıştırmam gerekiyordu çünkü uygulamamın herhangi bir zamanda gidip gelebilen 3 etkinliği var. Etkinlik1> Etkinlik2> Etkinlik3. Aktivitem3 üzerinde bir şey yaparken geri düğmesi düzgün bir şekilde Aktivite2'ye geri dönüyordu. Ancak, kullanarak finish()Activity2'den Activity1'e değil Activity3'e geri dönüyordu. Ve AppCompatActivity'yi genişletiyorum. Yani benim çözümüm şuydu:

public class Activity2 extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...

            getSupportActionBar().setHomeButtonEnabled(true);
        }
    }

AndroidManifest.xml'de:

<activity android:name=".activities.Activity2"
           android:parentActivityName="com.example.appname.activities.Activity1">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.appname.activities.Activity1" />
        </activity>

ve son olarak, menümdeki işlem düğmesi (işlem çubuğu):

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            ...

            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;

        }

        return super.onOptionsItemSelected(item);

    }

Kullanmak NavUtils.navigateUpFromSameTask(this);yerine benim için çalıştı finish().


1

Sadece bana yardımcı olan ve başkaları için faydalı olabilecek bir şeyi paylaşmak. Buradaki cevapların çoğu doğru olsa da getActionBar().setDisplayHomeAsUpEnabled(true);, bu benim için çalışmıyordu. Karşılaştığım sorun, manuel olarak ikinci bir Aktivite oluşturmaya çalışmamdı, ancak daha fazla ayrıntı var.
Sorunumu gerçekten çözen şey, Android Studio'nun kendi araçlarını kullanarak ikinci bir Etkinlik oluşturmak için Android Geliştiricileri eğitimini ( https://developer.android.com/training/basics/firstapp/starting-activity ) takip etmekti :

Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.

0

Ayrıca onBackPressed()onClick dinleyicinizi de kolayca yerleştirebilirsiniz . Bu, düğmenizin android uygulamalarında varsayılan "yedekle / yukarı" düğmeleri gibi davranmasına neden olur!


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

if (getSupportActionBar()==null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==android.R.id.home)
    finish();
return super.onOptionsItemSelected(item);
}

0

Bu benim için çalışıyor .. Diyelim ki iki etkinlik var (Activityone, Activitytwo)

Etkinlik İçinde İki Bu Kodu Kullanın

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

Activityone'da

//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));

Bu, manifest dosyasındaki ikinci aktiviteye dahil edilmelidir

<activity android:name=".Activitytwo"
        android:parentActivityName=".Activityone"></activity>

Ve sonuç şöyle olur

görüntü açıklamasını buraya girin


0
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YourxmlFileName);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

  public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id==android.R.id.home) {
            finish();
            return true;
        }
        return false;
    }

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.