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 laToolbar
inflada comoroot
- v21-style
setSupportActionBar
use<android.support.v7.widget.Toolbar android:id="@id/action_bar"
o pasar en laToolbar
inflada comoroot
- 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
}
});