studio programacion móviles eventos desarrollo curso atributo aplicaciones agregar android android-actionbar appcompat android-actionbar-compat android-actionbaractivity

programacion - Establecer OnClick Listener en el título de la barra de acción en Android



manual de programacion android pdf (8)

Creo que la respuesta de Simas es la mejor, pero aquí hay una versión hacky en caso de que prefieras eso.

ViewTools.findActionBarTitle(getWindow().getDecorView()).setOnClickListener(...);

Éste debería ser universal en el sentido de que funciona con:

  • acción de Android ActionBar
  • Soporte de ActionBar
  • setActionBar de estilo setActionBar
    use <Toolbar android:id="@+id/action_bar"
    o pasar en la Toolbar inflada como root
  • v21-style setSupportActionBar
    use <android.support.v7.widget.Toolbar android:id="@id/action_bar"
    o pasar en la Toolbar inflada como root
  • Las implementaciones de la Toolbar personalizada pueden necesitar un pequeño ajuste
    pero luego podrías encapsular esto en esa clase personalizada.

Aunque solo lo probé con soporte: v22.

/** @param root usually Activity.getWindow().getDecorView() or your custom Toolbar */ public static @Nullable View findActionBarTitle(@NonNull View root) { return findActionBarItem(root, "action_bar_title", "mTitleTextView"); } /** @param root usually Activity.getWindow().getDecorView() or your custom Toolbar */ public static @Nullable View findActionBarSubTitle(@NonNull View root) { return findActionBarItem(root, "action_bar_subtitle", "mSubtitleTextView"); } private static @Nullable View findActionBarItem(@NonNull View root, @NonNull String resourceName, @NonNull String toolbarFieldName) { View result = findViewSupportOrAndroid(root, resourceName); if (result == null) { View actionBar = findViewSupportOrAndroid(root, "action_bar"); if (actionBar != null) { result = reflectiveRead(actionBar, toolbarFieldName); } } if (result == null && root.getClass().getName().endsWith("widget.Toolbar")) { result = reflectiveRead(root, toolbarFieldName); } return result; } @SuppressWarnings("ConstantConditions") private static @Nullable View findViewSupportOrAndroid(@NonNull View root, @NonNull String resourceName) { Context context = root.getContext(); View result = null; if (result == null) { int supportID = context.getResources().getIdentifier(resourceName, "id", context.getPackageName()); result = root.findViewById(supportID); } if (result == null) { int androidID = context.getResources().getIdentifier(resourceName, "id", "android"); result = root.findViewById(androidID); } return result; } @SuppressWarnings("unchecked") public static <T> @Nullable T reflectiveRead(@NonNull Object object, @NonNull String fieldName) { try { Field field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true); return (T)field.get(object); } catch (Exception ex) { Log.w("HACK", "Cannot read " + fieldName + " in " + object, ex); } return null; }

Estoy trabajando en la aplicación de Android en la que estoy usando ActionBar modo que hay uno en el icono del cajón de navegación para abrirlo y el título de ActionBar en ActionBar . Quiero configurar un detector de clics en el título de ActionBar para que comience una nueva Activity y establezca un detector de clics diferente en el icono del cajón de navegación para abrir el menú del cajón de navegación.

ActionBar hacer clic en el icono del cajón de navegación, pero cuando hago clic en el título del título de ActionBar , también se abre el menú del cajón de navegación. ¿Hay alguna forma de establecer diferente escucha de clic en el título de ActionBar .

Gracias por adelantado.


Intente agregar este código en la función onCreate (). Esto tomará el recurso en el que se encuentra el título de la barra de acción y le asignará un ID que puede usar para agregar un OnClickListener. ¡Déjame saber como va!

final int abTitleId = getResources().getIdentifier("action_bar_title", "id", "android"); findViewById(abTitleId).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Do something } });


Podría usar un diseño personalizado para el título y asignarle un oyente:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActionBar actionBar = getActionBar(); if (actionBar != null) { // Disable the default and enable the custom actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowCustomEnabled(true); View customView = getLayoutInflater().inflate(R.layout.actionbar_title, null); // Get the textview of the title TextView customTitle = (TextView) customView.findViewById(R.id.actionbarTitle); // Change the font family (optional) customTitle.setTypeface(Typeface.MONOSPACE); // Set the on click listener for the title customTitle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.w("MainActivity", "ActionBar''s title clicked."); } }); // Apply the custom view actionBar.setCustomView(customView); } }

actionbar_title.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <TextView android:id="@+id/actionbarTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25sp" android:text="@string/app_name"/> </LinearLayout>


Puedes hacerlo fácilmente usando la barra de herramientas. Defina la barra de herramientas en el archivo XML de diseño como se indica a continuación:

<android.support.v7.widget.Toolbar android:id="@+id/MainActivityToolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="match_parent" android:text="@string/app_name" android:textSize="30sp" tools:ignore="RelativeOverlap" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:layout_marginRight="10dp" android:layout_marginLeft="10dp" /> <Button android:id="@+id/LogOutButton" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:layout_marginRight="10dp" android:layout_marginLeft="10dp" android:text="@string/logout" /> </RelativeLayout> </android.support.v7.widget.Toolbar>

Luego puedes configurar el oyente en Actividad usando este código:

setSupportActionBar((Toolbar) findViewById(R.id.MainActivityToolbar)); logOutButton = findViewById(R.id.LogOutButton); logOutButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //define your function for logout or something else LogOut(); } });


Puedes hacerlo fácilmente usando la barra de herramientas. Defina la barra de herramientas en el archivo XML de diseño como se indica a continuación:

<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?actionBarSize" android:background="?colorPrimary" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <TextView android:id="@+id/toolbarTitle" style="@style/TextAppearance.Widget.AppCompat.Toolbar.Title" android:background="?attr/selectableItemBackground" android:layout_width="wrap_content" android:gravity="center_vertical" android:layout_height="match_parent" /> </android.support.v7.widget.Toolbar>

Luego puedes configurar el oyente en Actividad usando este código:

setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); TextView toolbarTitle= (TextView) findViewById(R.id.toolbarTitle); toolbarTitle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // DO SOMETHING HERE } });


Si conoce el texto real que se encuentra en su Título, y está razonablemente seguro de que ningún otro TextView en la pantalla comparte ese título, puede usar una búsqueda recursiva en el Árbol de la Vista para encontrarlo.

Esta es una gran solución porque no requiere un reflejo del conocimiento interno de cómo se construye la barra de herramientas y le brinda acceso directo a TextView .

@Nullable public static TextView findTextViewWithText(@Nullable View toCheck, String toFind) { if (toCheck instanceof TextView) { String foundText = ((TextView) toCheck).getText().toString(); if (foundText.equals(toFind)) { return (TextView) toCheck; } } else if (toCheck instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) toCheck).getChildCount(); i++) { TextView found = findTextViewWithText(((ViewGroup) toCheck).getChildAt(i), toFind); if (found != null) { return found; } } } return null; }

La vista más confiable a la que se puede llamar es la vista de decoración, pero siéntase libre de experimentar lo que mejor funcione para sus propósitos, su millaje puede variar.

View found = findTextViewWithText( getActivity().getWindow().getDecorView(), "My Title"); if (found != null) { // Do something, like set a click listener }


Si desea utilizar la barra de acción existente actualmente y no la barra de herramientas, use lo siguiente:

ActionBar actBar = getSupportActionBar(); if(actBar != null) { actBar.setTitle(R.string.your_ab_title); } //Set actions to take when the AB is clicked Toolbar ab = findViewById(R.id.action_bar); if(ab != null){ for (int i= 0; i < ab.getChildCount(); i++){ View child = ab.getChildAt(i); if(child instanceof TextView || child instanceof ImageView) { child.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String url = "http://www.HoverDroids.com"; Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); startActivity(i); } }); } } }


Si está utilizando la barra de herramientas con soporte v7: 21. Echa un vistazo al siguiente código:

Field titleField = Toolbar.class.getDeclaredField("mTitleTextView"); titleField.setAccessible(true); TextView barTitleView = (TextView) titleField.get(mToolbar); barTitleView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } });