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?


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.


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

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.


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


Sepertinya ini cara termudah bagiku. Terima kasih
TuanDPH



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

3

Dalam metode OnCreate tambahkan ini:

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

Kemudian tambahkan metode ini:

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

1
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

dalam onCreatedmetode untuk api baru.


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

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

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);
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.