Android ActionBar geri düğmesi nasıl uygulanır?


137

Liste görünümü olan bir etkinliğim var. Kullanıcı öğeyi tıkladığında, "görüntüleyici" öğesi açılır:

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

Bu iyi çalışır, ancak eylem çubuğunda uygulama simgesinin yanındaki geri ok etkinleştirilmez. Bir şey mi kaçırıyorum?


64
getActionBar().setDisplayHomeAsUpEnabled(true);onCreate ve switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;}içinde onOptionsItemSelected? her ikisi de ServicesViewActivity
Selvin

7
Neden bir cevap rafı olarak değil?
KarlKarlsom

Yanıtlar:


264

Selvin zaten doğru cevabı gönderdi. İşte, güzel kodda çözüm:

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

İşlev NavUtils.navigateUpFromSameTask(this), AndroidManifest.xml dosyasında üst etkinliği tanımlamanızı gerektirir

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

Daha fazla okumak için buraya bakın .


1
Benim durumumda, çağrılmadan ebeveyn yaratma çağrısı yapmanın bir yolunu arıyordum. Bunu yapmak için uygulamanızı kullandım, ancak NavUtils.navigateUpFromSameTask (this) yerine finish () olarak adlandırdım. finish () benim için daha ideal olan onCreate yerine onStart'ımı çağırıyor.
Jon

Meta verileri manifest olarak ayarlamak, gezinme düğmesinin çalışmasını sağlamak için bir anahtardır
VSB

getActionBar().setDisplayHomeAsUpEnabled(true);Destek kitaplıkları kullanıyorsanız, kullanın .
Abhinav Upadhyay

"Silme" nin yönünü nasıl değiştirirsiniz? Varsayılan olarak, bu geri gezinmeyi uygulamak ekranı sağdan sola doğru kaydırır ve yeni bir ekran yüklüyor gibi görünüyor. Ancak, cihazın kendi geri tuşuna basmak gibi soldan sağa silinmesini istiyorum.
stingray_

Hatayı aldım: Neden: java.lang.NullPointerException: Bir null nesne başvurusunda sanal yöntem 'void android.app.ActionBar.setDisplayHomeAsUpEnabled (boolean)' çağrılmaya çalışılıyor
Jones

166

ActionBar Giriş Düğmesinin Etkinlik'te etkin olduğundan emin olun:

Android, API 5+:

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

ActionBarSherlock ve Uygulama Uyumlu, 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);
}

Örnek MainActivityuzanır 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);
        }
    }
}

Bu şekilde istediğiniz tüm aktiviteler geri alınabilir.

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>

Örnek MainActivityuzanır 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);
    }
}

GetSupportActionBar () değiştirdiğimde benim için çalışıyor. SetDisplayHomeAsUpEnabled (true); getActionBar () için ayarlayın. setDisplayHomeAsUpEnabled (true); ve bu @SuppressLint'i ("NewApi") içeride ve dışarıda onCreate yönteminde ekledi REF için: => developer.android.com/training/implementing-navigation/…
gnganpath 13:15

1
@ganpath Dikkatli, getActionBar kullanmak API 11+ içindir .
Jared Burrows

17

ActionBar geri düğmesini etkinleştirmek için Etkinliğinizde bir ActionBar'a ihtiyacınız vardır. Bu, kullandığınız tema tarafından ayarlanır. Etkinlikleriniz için temayı AndroidManfiest.xml. Örneğin @android:style/Theme.NoTitleBartemayı kullanıyorsanız , bir ActionBar'ınız yoktur. Bu durumda, çağrı getActionBar()null değerini döndürür. Bu yüzden önce bir ActionBar'ınız olduğundan emin olun.

Sonraki adım, android:parentActivityNamegeri düğmesine basarsanız gezinmek istediğiniz etkinliğe ayarlamaktır . Bu da yapılmalıdır AndroidManifest.xml.

Artık onCreate"alt" etkinliğinizin yönteminde geri düğmesini etkinleştirebilirsiniz .

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

Şimdi geri düğmesi için mantığı uygulamalısınız. onOptionsItemSelected"Alt" etkinliğinizdeki yöntemi geçersiz kılar ve geri düğmesinin kimliğini kontrol edersiniz android.R.id.home.

Şimdi eğer yöntem belirtmediyseniz eğer NavUtils.navigateUpFromSameTask(this); AMA yöntemini ateş android:parentActivityNameedebilirsiniz AndroidManifest.xmlbu uygulama çökecektir.

Bazen istediğiniz şey budur çünkü size bir şeyleri unuttuğunuzu hatırlatır. Bunu önlemek istiyorsanız, getParentActivityIntent()yöntemi kullanarak etkinliğinizin bir ebeveyni olup olmadığını kontrol edebilirsiniz . Bu null değerini döndürürse, üst öğeyi belirtmediniz.

Bu durumda onBackPressed(), temel olarak kullanıcının cihazdaki geri düğmesine basmasıyla aynı yöntemi uygulayabilirsiniz. Uygulamanızı asla kilitlemeyen iyi bir uygulama:

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

Lütfen kullanıcının gördüğü animasyonun NavUtils.navigateUpFromSameTask(this);ve ile arasında farklı olduğunu unutmayın onBackPressed().

Hangi yolu seçtiğiniz size kalmış, ancak özellikle tüm aktiviteleriniz için bir temel sınıf kullanıyorsanız çözümü yararlı buldum.


10

AndroidManifest dosyası:

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

Ayrıntılar ekle

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

Çalışıyor :]


Görünüşe göre bu benim için en kolay yol. Teşekkür ederim
TuanDPH



3

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

Bunu başarmak için sadece iki adım vardır,

Adım 1: AndroidManifest.xml adresine gidin ve şu parametreye etiketi ekleyin: android: parentActivityName = ". Home.HomeActivity"

misal :

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

2. Adım: Etkinlik Ayrıntılarında önceki sayfa / etkinlik için eyleminizi ekleyin

misal :

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

3

OnCreate yönteminde şunu ekleyin:

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

Ardından bu yöntemi ekleyin:

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

1
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

içinde onCreatedyeni apis için bir yöntem.


1

Araç Çubuğu'nu kullanıyorsanız, aynı sorunla karşı karşıyaydım. Bu iki adımı izleyerek çözdüm

  1. AndroidManifest.xml'de
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
  1. SecondActivity'de bunları ekleyin ...
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

Aşağıdaki adımlar geri düğmesi için yeterlidir:

Adım 1: Bu kod Manifest.xml dosyasında olmalıdır

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

2. Adım: Vermeyeceksiniz

finish();

Çocuk Etkinliği'ne başlarken Ana Etkinliğinizde.

Adım 3: Çocuk Aktivitesinden Ebeveyn Aktivitesine geri dönmeniz gerekiyorsa, Çocuk Aktivitesi için bu kodu vermeniz yeterlidir.

startActivity(new Intent(ParentActivity.this, ChildActivity.class));

0

Jared'in cevabına dayanarak, çeşitli etkinliklerde eylem çubuğu geri düğmesi davranışını etkinleştirmek ve uygulamak zorunda kaldım ve kod çoğaltmayı azaltmak için bu yardımcı sınıfı yarattım.

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

Bir aktivitede kullanım:

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

    ActionBarHelper.enableBackButton(this);
}
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.