Navegación de nuevo a la actividad de los padres en ActionBar sin manipulación
Tengo dos actividades que deseo que esta navegación suceda, ellos son VendorsActivity y QuestionsActivity. El siguiente aspecto de mi AndroidManifest.xml:
(No estoy usando el nombre completo de mis actividades como com.hello.world.MyActivity
como se define el atributo del package
en el nodo de manifest
.)
- Apariencia de texto personalizada de ActionBar en Android 4.3
- Cómo cambiar el icono predeterminado en el SearchView, para ser utilizado en la barra de acción de Android?
- Color de divisor de selección de pestañas de barra de acción
- Holo Light con Dark Actionbar muestra Holo Dark copiar y pegar iconos
- ¿Cómo puedo implementar la barra de acción personalizada con botones personalizados en Android?
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".VendorsActivity" android:label="@string/vendors_activity_title" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".TestsActivity" android:label="@string/tests_activity_title" android:parentActivityName=".VendorsActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".VendorsActivity" /> </activity> <activity android:name=".QuestionsActivity" android:label="@string/questions_activity_title" > </activity> </application>
Y en TestsActivity
, estoy llamando a getActionBar().setDisplayHomeAsUpEnabled(true);
Método dentro del método onCreate
.
El problema es que no funcionará si no implemento el siguiente método en la clase .TestsActivity
:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(TestsActivity.this); return true; default: return super.onOptionsItemSelected(item); } }
Pero la Guía para programadores de Android dice que no tengo que manejar el evento del botón Subir como se mencionó en la parte inferior de la página de resultados: https://developer.android.com/training/basics/actionbar/adding-buttons.html
Debido a que el sistema ahora conoce MainActivity es la actividad principal de DisplayMessageActivity, cuando el usuario presiona el botón Arriba, el sistema navega a la actividad padre según corresponda, no es necesario manejar el evento del botón Arriba.
Editar y Responder:
Como dice la Guía para desarrolladores de Android:
A partir de Android 4.1 (API nivel 16), puede declarar el padre lógico de cada actividad especificando el atributo android: parentActivityName en el elemento.
Si su aplicación es compatible con Android 4.0 o inferior, incluya la Biblioteca de asistencia con su aplicación y agregue un elemento dentro de la aplicación. A continuación, especifique la actividad principal como el valor de android.support.PARENT_ACTIVITY, que coincida con el atributo android: parentActivityName.
Así que creo que mi problema fue por dos razones:
-
Ejecutar la aplicación en un emulador adecuado. Estaba apuntando a una versión más alta, pero el emulador se ejecutaba en API 14 (Android 4.0) por lo que no sabía cómo manejar el atributo
android:parentActivityName
. -
Orientación del nivel de API correcto en las propiedades de destino del proyecto como se muestra a continuación:
- ActionBar no se desplaza a la pestaña seleccionada si ésta está fuera de los límites visibles de actionBar en la pantalla
- Android: quita el botón "Más acciones" del ActionBar
- Quitar Icono pero tener HomeAsUp en ActionBar
- Definido por el usuario ActionBar Action View: obtener el ancho correcto
- Configuración ActionMode Background programmatically
- Cambiar la barra de acción en color
- Android: ocultar la barra de acción durante el inicio y luego volver a mostrarla?
- ¿Cómo puedo abrir el SearchView mediante programación?
Android: parentActivityName sólo se admite después del nivel API.
Una alternativa es usar soporte-biblioteca: v7 combinado con NavUtils .
Hay un gran material de capacitación sobre este tema (incluya el problema de compatibilidad). Por favor, consulte – http://developer.android.com/training/implementing-navigation/ancestral.html
Dicho esto, estoy publicando mi código de abajo porque está funcionando: –
MainActivity.Java
package com.example.activitydatasend; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button click = (Button) findViewById(R.id.click); click.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this,Second.class); intent.putExtra("first", "first"); intent.putExtra("second", "second"); startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
SecondActivity.java
package com.example.activitydatasend; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class Second extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); Bundle bundle = getIntent().getExtras(); String a = bundle.getString("first"); String b = bundle.getString("second"); System.out.println(a+b); getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
AndroidManifext.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.activitydatasend" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.activitydatasend.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.activitydatasend.Second" android:label="@string/app_name" android:parentActivityName="com.example.activitydatasend.MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest>
Activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/click" android:text="Click" /> </RelativeLayout>
Segundo.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Second Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </RelativeLayout>
Si recibe un error similar al
E/NavUtils﹕ getParentActivityIntent: bad parentActivityName
o
does not have a parent activity name specified. (Did you forget to add the android.support.PARENT_ACTIVITY <meta-data> element in your manifest?)
Es probable que necesite cambiar android: valor a la ruta completa. Así que en lugar de
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity" />
hacer
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.package.SecondActivity" />
Puede agregar metadatos en el manifiesto para apoyar el sistema operativo pre JellyBean.
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".VendorsActivity" />
¿Qué versión de API está utilizando? En mi experiencia, para las versiones anteriores es necesario manejar el evento del botón up, mientras que en las versiones posteriores se hace para ti.
No he mirado en qué versión exacta cambia esto, pero sé que la API 13 no la maneja para usted, mientras que la API 16 lo hace .