Cómo implementar el Android ActionBar botón atrás?

Tengo una actividad con un listview. Cuando el usuario haga clic en el elemento, el elemento de «visor» que se abre:

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

Esto funciona bien, pero en el actionbar la parte de atrás de la flecha al lado del icono de la aplicación no se activan. Me estoy perdiendo algo?

  • getActionBar().setDisplayHomeAsUpEnabled(true); en onCreate y switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;} en onOptionsItemSelected ? tanto en ServicesViewActivity
  • ¿Por qué no como una respuesta de la estantería?
InformationsquelleAutor Joaolvcm | 2012-04-11

11 Kommentare

  1. 245

    Selvin ya han publicado la respuesta correcta, aquí sólo es la solución en bastante código 😉

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

    La función NavUtils.navigateUpFromSameTask(this) requiere que se defina la actividad de los padres en la AndroidManifest.xml archivo

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

    http://developer.android.com/design/patterns/navigation.html#up-vs-back

    • En mi situación yo estaba buscando una manera de no llamar onCreate de los padres cuando regresan a ella. Para ello, he utilizado la aplicación, pero se llama finish() en lugar de NavUtils.navigateUpFromSameTask(este). finish() llama a mi onStart en lugar de onCreate que era más ideal para mí.
    • Ajuste de meta-datos en un manifiesto es una de las claves para hacer botón de navegación de trabajo
    • Uso getActionBar().setDisplayHomeAsUpEnabled(true); en caso que usted está utilizando las bibliotecas de soporte.
    • ¿Cómo se puede cambiar la dirección de la «limpiar»? De forma predeterminada, la aplicación de esta vuelta de navegación barre la pantalla de derecha a izquierda, y parece que carga una nueva pantalla. Sin embargo, quiero que se limpie de izquierda a derecha, justo como golpear el dispositivo propio de la clave.
  2. 150

    Asegúrese de que su la ActionBar Botón de Inicio se encuentra habilitado en la Actividad:

    Android, API 5+:

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

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

    Ejemplo MainActivity que se extiende 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);
            }
        }
    }

    De esta manera todas las actividades que usted desea puede tener la 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>

    Ejemplo MainActivity que se extiende 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);
        }
    }
    • Se está trabajando para mí cuando yo cambio getSupportActionBar().setDisplayHomeAsUpEnabled(true); en getActionBar().setDisplayHomeAsUpEnabled(true); y añade estas @SuppressLint(«NewApi»), en el método onCreate dentro y outsideFor REF : => developer.android.com/training/implementing-navigation/…
    • Cuidado, utilizando getActionBar es para API 11+.
  3. 13

    Para habilitar el ActionBar botón atrás obviamente, se necesita una ActionBar en su Actividad.
    Este es fijado por el tema que está utilizando. Puede establecer el tema para su Actividad en el AndroidManfiest.xml. Si usted está utilizando el correo.g el @android:style/Theme.NoTitleBar tema, usted dont tienen una ActionBar. En este caso la llamada a getActionBar() devolverá null. Así que asegúrese de que usted tiene una ActionBar primera.

    Siguiente paso es establecer la android:parentActivityName a la actividad que desea navegar si pulsa el botón atrás. Esto debe ser hecho en el AndroidManfiest.xml demasiado.

    Ahora se puede activar el botón atrás en la onCreate método de su «hijo» de la actividad.

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

    Ahora debe implementar la lógica para el botón atrás. Usted simplemente reemplazar la onOptionsItemSelected método en su «hijo» de la actividad y de verificación para la identificación de la parte de atrás del botón que se android.R.id.home.

    Ahora usted puede disparar el método NavUtils.navigateUpFromSameTask(this); PERO si usted no tiene especificado el android:parentActivityName en que AndroidManfiest.xml esto va a bloquear la aplicación.

    A veces esto es lo que quiere porque sus ventas, le recuerda que usted se olvidó de «algo», pero si quieres evitar esto, usted puede comprobar si su actividad tiene un padre usando la getParentActivityIntent() método. Si devuelve null, usted no tiene especificado el padre.

    En este caso, usted puede encender la onBackPressed() método que hace básicamente lo mismo que si el usuario presiona el botón atrás del dispositivo. Una buena aplicación que nunca crashs que la aplicación sería

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

    Por favor, tenga en cuenta que la animación que el usuario ve es diferente entre NavUtils.navigateUpFromSameTask(this); y onBackPressed().

    Es usted el que camino tomar, pero he encontrado la solución útil, especialmente si usted usa una clase base de todas sus actividades.

  4. 8

    AndroidManifest de archivo:

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

    agregar en DetailsActivity:

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

    de trabajo :]

  5. 3

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

    Para lograr esto, simplemente, hay dos pasos,

    Paso 1: Ir a AndroidManifest.xml y en el complemento el parámetro de etiqueta – android:parentActivityName=».casa.HomeActivity»

    ejemplo :

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

    Paso 2: en ActivityDetail agregar que la acción de la página anterior/actividad

    ejemplo :

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

    En el método OnCreate añadir esto:

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

    A continuación, agregue el siguiente método:

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

    Si usted está utilizando la Barra de herramientas, estaba frente a la misma cuestión. He resuelto siguiendo estos dos pasos

    1. En el AndroidManifest.xml
    <activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
    1. En el SecondActivity, agregar estos…
    Toolbar toolbar = findViewById(R.id.second_toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  8. 0

    Siguientes Pasos son mucho suficiente para botón atrás:

    Paso 1:
    Este código debe estar en 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>

    Paso 2:
    No dar

    finish();

    en su Actividad principal, aunque el inicio de la Actividad del Niño.

    Paso 3:
    Si usted necesita para volver a la Actividad principal de la Actividad del Niño, Entonces usted acaba de dar en este código para la Actividad del Niño.

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea