Bagaimana cara menerapkan tombol kembali Android ActionBar?

139

Saya memiliki aktivitas dengan listview. Saat pengguna mengklik item, item "viewer" terbuka:

List1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

        Intent nextScreen = new Intent(context,ServicesViewActivity.class);
        String[] Service = (String[])List1.getItemAtPosition(arg2);

        //Sending data to another Activity
        nextScreen.putExtra("data", datainfo);
        startActivityForResult(nextScreen,0);
        overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
    }
});

Ini berfungsi dengan baik, tetapi pada bilah tindakan panah kembali di sebelah ikon aplikasi tidak diaktifkan. Apakah saya melewatkan sesuatu?

Joaolvcm
sumber
64
getActionBar().setDisplayHomeAsUpEnabled(true);di onCreate dan switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;}di onOptionsItemSelected? keduanya di ServicesViewActivity
Selvin
7
Mengapa tidak sebagai rak jawaban?
KarlKarlsom

Jawaban:

269

Selvin sudah memposting jawaban yang benar. Di sini, solusinya dalam kode cantik:

public class ServicesViewActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // etc...
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

Fungsi ini NavUtils.navigateUpFromSameTask(this)mengharuskan Anda untuk menentukan aktivitas induk di file AndroidManifest.xml

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

Lihat di sini untuk bacaan lebih lanjut.

surffan
sumber
1
Dalam situasi saya, saya sedang mencari cara untuk tidak memanggil onCreate dari orang tua ketika kembali ke sana. Untuk melakukan ini, saya menggunakan implementasi Anda, tetapi memanggil finish (), bukan NavUtils.navigateUpFromSameTask (this). finish () memanggil onStart saya, bukan onCreate, yang lebih ideal untuk saya.
Jon
Mengatur meta-data dalam manifes adalah kunci untuk membuat tombol navigasi berfungsi
VSB
Gunakan getActionBar().setDisplayHomeAsUpEnabled(true);jika Anda menggunakan pustaka dukungan.
Abhinav Upadhyay
Bagaimana Anda mengubah arah "wipe"? Secara default, menerapkan navigasi belakang ini menyapu layar dari kanan ke kiri, dan sepertinya sedang memuat layar baru. Namun, saya ingin menghapusnya dari kiri ke kanan, seperti menekan tombol belakang perangkat itu sendiri.
ikan
Saya mendapat kesalahan: Disebabkan oleh: java.lang.NullPointerException: Mencoba memanggil metode virtual 'void android.app.ActionBar.setDisplayHomeAsUpEnabled (boolean)' pada referensi objek null
Jones
168

Pastikan Tombol Beranda ActionBar Anda diaktifkan di Aktivitas:

Android, API 5+:

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

ActionBarSherlock dan App-Compat, API 7+:

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

Android, API 11+:

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

Contoh MainActivityyang meluas ActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home: 
            // API 5+ solution
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

Dengan cara ini semua aktivitas yang Anda inginkan dapat memiliki backpress.

Android, API 16+:

http://developer.android.com/training/implementing-navigation/ancestral.html

AndroidManifest.xml:

<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.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

Contoh MainActivityyang meluas ActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @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);
    }
}
Jared Burrows
sumber
Ini berfungsi untuk saya ketika saya mengubah getSupportActionBar (). SetDisplayHomeAsUpEnabled (true); masuk ke getActionBar (). setDisplayHomeAsUpEnabled (true); dan menambahkan @SuppressLint ("NewApi") ini pada metode onCreate di dalam dan di luarUntuk REF: => developer.android.com/training/implementing-navigation/…
gnganapath
1
@ganpath Hati-hati, menggunakan getActionBar adalah untuk API 11+ .
Jared Burrows
18

Untuk mengaktifkan tombol kembali ActionBar Anda jelas membutuhkan ActionBar di Aktivitas Anda. Ini diatur oleh tema yang Anda gunakan. Anda dapat menyetel tema untuk Aktivitas Anda di AndroidManfiest.xml. Jika Anda menggunakan misalnya @android:style/Theme.NoTitleBartema, Anda tidak memiliki ActionBar. Dalam hal ini panggilan ke getActionBar()akan mengembalikan nol. Jadi, pastikan Anda memiliki ActionBar terlebih dahulu.

Langkah selanjutnya adalah menyetel android:parentActivityNameke aktivitas yang ingin Anda navigasi jika Anda menekan tombol kembali. Ini harus dilakukan di AndroidManifest.xmljuga.

Sekarang Anda dapat mengaktifkan tombol kembali dalam onCreatemetode aktivitas "anak" Anda.

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

Sekarang Anda harus menerapkan logika untuk tombol kembali. Anda cukup mengganti onOptionsItemSelectedmetode dalam aktivitas "anak" Anda dan memeriksa id dari tombol kembali yaitu android.R.id.home.

Sekarang Anda dapat mengaktifkan metode NavUtils.navigateUpFromSameTask(this); TAPI jika Anda tidak menentukannya di android:parentActivityNamedalam Anda, AndroidManifest.xmlini akan merusak aplikasi Anda.

Terkadang ini yang Anda inginkan karena mengingatkan Anda bahwa Anda lupa "sesuatu". Jadi jika ingin mencegahnya, Anda bisa memeriksa apakah aktivitas Anda memiliki induk yang menggunakan getParentActivityIntent()metode tersebut. Jika ini mengembalikan null, Anda belum menentukan induknya.

Dalam hal ini Anda dapat mengaktifkan onBackPressed()metode yang pada dasarnya sama seperti jika pengguna menekan tombol kembali pada perangkat. Penerapan yang baik yang tidak pernah membuat aplikasi Anda mogok adalah:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            if (getParentActivityIntent() == null) {
                Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!");
                onBackPressed();
            } else {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Harap perhatikan bahwa animasi yang dilihat pengguna berbeda antara NavUtils.navigateUpFromSameTask(this);dan onBackPressed().

Terserah Anda jalan mana yang Anda ambil, tetapi saya menemukan solusi yang membantu, terutama jika Anda menggunakan kelas dasar untuk semua aktivitas Anda.

dknaack
sumber
Terima kasih! Ini bekerja dengan baik.
Waheed Nazir
10

File AndroidManifest:

    <activity android:name=".activity.DetailsActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="br.com.halyson.materialdesign.activity.HomeActivity" />
    </activity>

tambahkan DetailsActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

berhasil:]

Sågär Śåxëńá
sumber
Sepertinya ini cara termudah bagiku. Terima kasih
TuanDPH
4

Saya pikir onSupportNavigateUp()cara termudah dan terbaik untuk melakukannya

periksa kode di tautan ini Klik di sini untuk kode lengkap

Inzimam Tariq IT
sumber
1
Bagus! Bekerja untuk saya. Terima kasih!
morja
3

https://stackoverflow.com/a/46903870/4489222

Untuk mencapai ini, hanya ada dua langkah,

Langkah 1: Buka AndroidManifest.xml dan tambahkan parameter di tag - android: parentActivityName = ". Home.HomeActivity"

contoh:

 <activity
    android:name=".home.ActivityDetail"
    android:parentActivityName=".home.HomeActivity"
    android:screenOrientation="portrait" />

Langkah 2: di ActivityDetail tambahkan tindakan Anda untuk halaman / aktivitas sebelumnya

contoh:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
      case android.R.id.home: 
          onBackPressed();
          return true;
   }
   return super.onOptionsItemSelected(item);}
}
Vivek Hande
sumber
3

Dalam metode OnCreate tambahkan ini:

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

Kemudian tambahkan metode ini:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
Marco Concas
sumber
1
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

dalam onCreatedmetode untuk api baru.

Kartik Garasia
sumber
1

Jika Anda menggunakan Toolbar, saya menghadapi masalah yang sama. Saya menyelesaikannya dengan mengikuti dua langkah ini

  1. Di AndroidManifest.xml
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
  1. Di SecondActivity, tambahkan ini ...
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
pengguna2823506
sumber
0

Langkah-langkah berikut sudah cukup untuk tombol kembali:

Langkah 1: Kode ini harus ada di Manifest.xml

<activity android:name=".activity.ChildActivity"
        android:parentActivityName=".activity.ParentActivity"
        android:screenOrientation="portrait">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.ParentActivity" /></activity>

Langkah 2: Anda tidak akan memberi

finish();

dalam Aktivitas Orang Tua Anda saat memulai Aktivitas Anak.

Langkah 3: Jika Anda perlu kembali ke Aktivitas Orang Tua dari Aktivitas Anak, maka Anda cukup memberikan kode ini untuk Aktivitas Anak.

startActivity(new Intent(ParentActivity.this, ChildActivity.class));
Kumar VL
sumber
0

Berdasarkan jawaban Jared, saya harus mengaktifkan dan mengimplementasikan perilaku tombol kembali bilah tindakan di beberapa aktivitas dan membuat kelas pembantu ini untuk mengurangi duplikasi kode.

public final class ActionBarHelper {
    public static void enableBackButton(AppCompatActivity context) {
        if(context == null) return;

        ActionBar actionBar = context.getSupportActionBar();
        if (actionBar == null) return;

        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

Penggunaan dalam suatu aktivitas:

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

    ActionBarHelper.enableBackButton(this);
}
datchung
sumber