Android - Tombol kembali di bilah judul

112

Di banyak aplikasi (Kalender, Drive, Play Store) saat Anda mengetuk tombol dan memasukkan aktivitas baru, ikon di bilah judul berubah menjadi tombol kembali, tetapi untuk aplikasi yang saya buat, tidak melakukan itu. Bagaimana cara membuat ikon itu membawa Anda kembali ke layar sebelumnya?

Drew
sumber
Coba getSupportActionBar () dalam contoh OnCreate di sini freakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy

Jawaban:

146

Ada dua langkah sederhana untuk membuat tombol kembali di bilah judul:

Pertama, buat ikon aplikasi dapat diklik menggunakan kode berikut dalam aktivitas yang bilah judulnya ingin Anda beri tombol kembali:

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

Setelah Anda menambahkan kode di atas, Anda akan melihat panah kembali muncul di sebelah kiri ikon aplikasi.

masukkan deskripsi gambar di sini

Kedua, setelah Anda melakukan hal di atas, Anda masih harus membuat kode yang akan memanfaatkan event click. Untuk melakukannya, ketahuilah bahwa, ketika Anda benar-benar mengklik ikon aplikasi, sebuah onOptionsItemSelectedmetode dipanggil. Jadi untuk kembali ke aktivitas sebelumnya, tambahkan metode itu ke aktivitas Anda dan masukkan Intentkode di dalamnya yang akan mengembalikan Anda ke aktivitas sebelumnya. Misalnya, aktivitas yang Anda coba kembali ke aktivitas dipanggil MyActivity. Untuk kembali ke sana, tulis metode sebagai berikut:

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

Itu dia!

(Di Android Developers API, itu merekomendasikan untuk bermain-main dengan manifes dan menambahkan hal-hal seperti android:parentActivityName. Tapi itu tampaknya tidak berhasil untuk saya. Yang di atas lebih sederhana dan lebih dapat diandalkan.)

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

Dan dalam Aktivitas Anda

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Luke F.
sumber
23
Anda menjelaskan dengan baik tetapi jika tidak salah di onOptionItemSelected Anda harus memanggil finish (); dalam kasus Anda startActivityForResult akan meluncurkan aktivitas kedua dan ketika Anda akan menekan kembali dari aktivitas kedua Anda akan dilempar kembali ke aktivitas pertama (di mana Anda menekan ikon bilah tindakan)
Yahya Arshad
8
Selain itu, Anda harus melakukannya hanya jika item.getItemId () adalah android.R.id.home
bitek
2
Seperti yang dinyatakan AS: "Pemanggilan metode 'actionBar.setDisplayHomeAsUpEnabled (true)' dapat menghasilkan java.lang.NullPointerException"
statosdotcom
1
Peringatan! Dengan ToolBar actionBar mengembalikan null dengan crash. Lihat jawaban di bawah.
CoolMind
5
getActionBar () tidak berfungsi untuk saya, aplikasi hanya mogok. getSupportActionBar () berhasil.
john ktejik
60

gunakan kode ini

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

setelah itu tulis kode ini di onOptionsItemSelectedmetode

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }
anupam sharma
sumber
1
getActionBar()memberi saya nol; apa kamu tahu kenapa?
msysmilu
3
karena tidak ada ActionBar, misalnya dengan gaya <item name = "android: windowActionBar"> false </item> <item name = "android: windowNoTitle"> true </item>
Paul Verest
48

Saya akhirnya berhasil menambahkan tombol kembali ke actionbar / toolbar dengan benar

@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;
}
Lucy Fair
sumber
3
Ini adalah satu-satunya jawaban yang berhasil untuk saya. Terima kasih @LucyFair
Arda Çebi
2
Sama. Terima kasih atas jawaban Anda.
Maria
Sama. Tidak ada jawaban lain yang berhasil. Ini seharusnya jawaban yang diterima.
El Sushiboi
18

1.- Tambahkan aktivitas ke AndroidManifest.xml dan pastikan untuk memberikan meta-data:

<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.- Tambahkan kode berikut ke metode onCreate aktivitas:

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

3.- Ganti onOptionsItemSelected dan gunakan metode statis NavUtils.navigateUpFromSameTask () untuk menavigasi melempar tumpukan.

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

Namun, penggunaan navigationUpFromSameTask () hanya cocok jika aplikasi Anda adalah pemilik tugas saat ini (yaitu, pengguna memulai tugas ini dari aplikasi Anda). Jika itu tidak benar dan aktivitas Anda dimulai dalam tugas yang dimiliki aplikasi lain, maka menavigasi ke Atas akan membuat tugas baru milik aplikasi Anda, yang mengharuskan Anda membuat back-stack baru.

spacebiker
sumber
Terima kasih telah memperkenalkan NavUtils!
AntonSack
10

Jika aktivitas Anda memang memperluas Aktivitas

public class YourActivity extends Activity {

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

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

Jika tindakan Anda memperluas AppCompatActivity

public class YourActivity extends AppCompatActivity {

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

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

Tidak ada lagi yang bisa dilakukan, Lihat Menambahkan tindakan

[OPTIONAL] Untuk secara eksplisit mendefinisikan aktivitas induk, ubah Manifest.xml Anda seperti ini:

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

Lihat Menentukan Aktivitas Induk

tot
sumber
1
Inilah yang sebenarnya saya cari. Anda menyelamatkan hari saya. Terima kasih banyak.
Tashi Dendup
6

Jika aktivitas AppCompatActivityAnda meluas, Anda perlu mengganti onSupportNavigateUp()metode seperti ini:

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

Tangani logika Anda dalam onBackPressed()metode Anda dan panggil saja metode itu onSupportNavigateUp()sehingga tombol kembali pada telepon dan panah pada bilah alat melakukan hal yang sama.

Kehancuran
sumber
6

pertama-tama di Fungsi onCreate tambahkan baris berikut

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

dan kemudian tambahkan fungsi berikut ke dalam kode:

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

        return super.onOptionsItemSelected(item);
    }
M Anees
sumber
6

Pertama, Anda perlu menulis kode ini

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

Kemudian tambahkan baris ini dalam manifes

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

Saya pikir itu akan berhasil

Shahriar Ahmad
sumber
5

Jika Anda menggunakan pustaka dukungan baru untuk 5.1 di android studio, Anda dapat menggunakannya di AppCompatActivity

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

Bersulang.

ralphgabb.dll
sumber
5

Cara termudah dan praktik terbaik seperti yang dijelaskan google di sini :

1. Tambahkan orang tua untuk childActivity Anda di AndroidManifest.xml:

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

2. Aktifkan tombol kembali di childActivity Anda:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

Berhasil untuk saya, saya harap ini juga berhasil untuk Anda.

luke8800gts
sumber
ini hanya valid jika aktivitas hanya dapat memiliki satu aktivitas induk. Itulah kasus saya. +1
MQoder
Langkah 2 tidak diperlukan dalam kasus saya.
Thomio
5

Setelah waktu yang berkualitas saya temukan, opsi tema adalah masalah utama dalam kode saya Dan berikut ini adalah cara yang tepat untuk menunjukkan toolbar untuk saya

Di file AndroidManifest, pertama Anda harus mengubah gaya tema Anda

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

lalu di aktivitas xml Anda perlu memanggil Toolbar Anda sendiri seperti

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

Dan kemudian toolbar ini harus dipanggil di file Java Anda oleh

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

Dan untuk toolbar yang menampilkan U harus memeriksa null untuk menghindari NullPointerException

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

Untuk aktivitas Rumah, tambahkan ini

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

        return super.onOptionsItemSelected(item);
    }

ATAU untuk aktivitas yang Anda inginkan kembali

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

Saya melihat jawaban yang sangat kompleks, jadi ini kode saya. Bekerja disini. Anda dapat mencapai ini dengan dua cara.

1) Kompatibilitas android standar

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) Gunakan ikon khusus

Jika Anda ingin menggunakan kode dalam komentar, Anda hanya perlu menambahkan file ini dalam drawable, bernama ic_arrow_white_24dp.xml

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

Dengan kode ini.

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

Semoga ini akan membantu beberapa orang di sini!

Zhar
sumber
2

Versi berbobot ringan tanpa menggunakan ActionBarActivityyang masih memiliki bahaviors yang sama di sini:

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

Penggunaan: Masukan new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);di onCreate.

Tuhanku
sumber
Ini cocok dengan widget Toolbar baru yang disertakan dalam pustaka dukungan. Terima kasih!!
Clocker
2

Anda perlu menambahkan kode yang disebutkan di bawah ini dalam file manifes. Cari aktivitas di mana Anda ingin menambahkan fungsionalitas panah kembali. Jika Anda menemukannya maka baik-baik saja atau buat aktivitas

<activity android:name=".SearchActivity">

</activity>

Kemudian tambahkan tiga baris kode berikut di antaranya.

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

Dan jangan lupa untuk menambahkan potongan kode ini di onCreate (); metode aktivitas khusus Anda di mana Anda membutuhkan panah kembali.

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

Beginilah cara saya memecahkan masalah. Terima kasih.

Muhammad Raqib
sumber
2

Jawaban lain tidak menyebutkan bahwa Anda juga dapat mengatur ini dalam XML Toolbarwidget Anda :

app:navigationIcon="?attr/homeAsUpIndicator"

Sebagai contoh:

<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" />
Michael Litvin
sumber
2

Yang perlu Anda lakukan di tahun 2020:
(mengingat Anda ingin kembali ke MainActivity)

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;
}
Ahmed Abdullah
sumber
Itu menarik, tetapi Anda berasumsi bahwa kami ingin kembali ke MainActivity. Bagaimana Anda akan mengarahkan ke aktivitas sebelumnya?
mayid
1

Itu juga bisa dilakukan tanpa kode dengan menentukan aktivitas induk di manifes aplikasi Jika Anda menginginkan tombol kembali di Aktivitas B yang akan membuka Aktivitas A, cukup tambahkan Aktivitas A sebagai induk Aktivitas B di manifes.

aby4reality
sumber
1

Untuk kotlin:

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }
Raluca Lucaci
sumber
1

Saya perlu mencampur beberapa jawaban untuk mendapatkan jawaban yang tepat untuk saya karena aplikasi saya memiliki 3 aktivitas yang dapat pergi dan kembali kapan saja. Aktivitas1> Aktivitas2> Aktivitas3. Saat saya melakukan sesuatu di aktivitas3 saya, tombol kembali mencadangkan dengan benar ke Aktivitas2. Namun, dari Aktivitas2, menggunakan finish(), itu kembali ke Aktivitas3 dan bukan Aktivitas1. Dan saya memperluas AppCompatActivity. Jadi, solusi saya adalah:

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

            getSupportActionBar().setHomeButtonEnabled(true);
        }
    }

di AndroidManifest.xml:

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

dan terakhir, tombol tindakan di menu saya (bilah tindakan):

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

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

        }

        return super.onOptionsItemSelected(item);

    }

Menggunakan NavUtils.navigateUpFromSameTask(this);berhasil untuk saya, bukan finish().

Gi Tavares
sumber
1

Sekedar sharing sesuatu yang membantu saya dan semoga bermanfaat untuk sesama. Meskipun sebagian besar jawaban di sini benar, dengan menggunakan getActionBar().setDisplayHomeAsUpEnabled(true);, ini tidak berhasil untuk saya. Masalah yang saya hadapi adalah saya mencoba membuat Aktivitas kedua secara manual, tetapi ada lebih banyak detail yang terlibat.
Apa yang benar-benar memecahkan masalah saya adalah mengikuti tutorial Pengembang Android ( https://developer.android.com/training/basics/firstapp/starting-activity ) untuk membuat Aktivitas kedua menggunakan alat Android Studio sendiri:

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.
ofri cofri
sumber
0

Anda juga dapat dengan mudah memasukkan onBackPressed()listener onClick Anda. Hal ini menyebabkan tombol Anda berfungsi seperti tombol "mundur / naik" default di aplikasi android!

pengguna3700215
sumber
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);
}
Abhay Agrawal
sumber
0

Ini berfungsi untuk saya .. Misalkan ada dua aktivitas (Aktivitas satu, Aktivitas dua)

Di dalam Aktivitas, dua menggunakan kode ini

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

Di Activityone

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

Ini harus dimasukkan dalam aktivitas kedua di dalam file manifes

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

Dan hasilnya akan seperti ini

masukkan deskripsi gambar di sini

Muhaiminur Rahman
sumber
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;
    }
S. Adikaram
sumber