android - ¿Cómo obtener la vista de ActionBar?
view android-actionbar (5)
Creo que esta solución es más completa, ya que maneja tanto la actividad normal como la ActionBarActivity.
También maneja el caso de que la barra de acciones se configuró utilizando una barra de herramientas, pero debe implementarla en la actividad que ha creado:
public static View getActionBarView(final Activity activity) {
if (activity instanceof IToolbarHolder)
return ((IToolbarHolder) activity).getToolbar();
final String packageName = activity instanceof ActionBarActivity ? activity.getPackageName() : "android";
final int resId = activity.getResources().getIdentifier("action_bar_container", "id", packageName);
final View view = activity.findViewById(resId);
return view;
}
public interface IToolbarHolder {
public android.support.v7.widget.Toolbar getToolbar();
}
Estoy usando la biblioteca Showcase
para explicar la función de mi aplicación al usuario. En algún punto necesito atenuar toda la ActionBar
de ActionBar
para presentar otra característica al usuario.
Para eso estoy usando el setAlpha(float num)
de la clase View
. Y para hacer eso necesito obtener la instancia de vista real de mi ActionBar
Y, por cierto, estoy usando la biblioteca support-7-appcompat
que ofrece compatibilidad con ActionBar para sistemas más antiguos.
ACTUALIZAR:
Mientras tanto, encontré esta opción, si configura una vista personalizada y la agrega a ActionBar
usando:
getSupportActionBar().setCustomView(v);
Luego, para obtener la View
de la ActionBar
de ActionBar
, puede hacer lo siguiente:
(View) activity.getSupportActionBar().getCustomView().getParent().getParent()
Pero creo que debe haber una forma más simple y fácil de hacer eso.
¿Alguien lo sabe?
Gracias por adelantado.
Esto obtendrá la Toolbar
/ Toolbar
ActionBar
cuando use la Toolbar
de Toolbar
nativa, su propia Toolbar
de Toolbar
desde appcompat o la Toolbar
de Toolbar
nativa en Lollipop:
public static ViewGroup findActionBar(Activity activity) {
int id = activity.getResources().getIdentifier("action_bar", "id", "android");
ViewGroup actionBar = null;
if (id != 0) {
actionBar = (ViewGroup) activity.findViewById(id);
}
if (actionBar == null) {
actionBar = findToolbar((ViewGroup) activity.findViewById(android.R.id.content)
.getRootView());
}
return actionBar;
}
private static ViewGroup findToolbar(ViewGroup viewGroup) {
ViewGroup toolbar = null;
for (int i = 0, len = viewGroup.getChildCount(); i < len; i++) {
View view = viewGroup.getChildAt(i);
if (view.getClass().getName().equals("android.support.v7.widget.Toolbar")
|| view.getClass().getName().equals("android.widget.Toolbar")) {
toolbar = (ViewGroup) view;
} else if (view instanceof ViewGroup) {
toolbar = findToolbar((ViewGroup) view);
}
if (toolbar != null) {
break;
}
}
return toolbar;
}
Hice una pequeña corrección en el código de @idunnololz para admitir ActionBarSherlock
private View getActionBarView() {
int actionViewResId = 0;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
actionViewResId = getResources().getIdentifier(
"abs__action_bar_container", "id", getPackageName());
} else {
actionViewResId = Resources.getSystem().getIdentifier(
"action_bar_container", "id", "android");
}
if (actionViewResId > 0) {
return this.findViewById(actionViewResId);
}
return null;
}
Sí. Puede obtener la vista usando esta función:
public View getActionBarView() {
Window window = getWindow();
View v = window.getDecorView();
int resId = getResources().getIdentifier("action_bar_container", "id", "android");
return v.findViewById(resId);
}
Casi de la manera en que esto funciona es que el contenedor de la barra de acciones usa el id android.R.id.action_bar_container
, pero esta identificación no es pública. Por lo tanto, usamos getIdentifier () para recuperar esta identificación y luego el resto es simple.
para support.v7 getActionBarView (ById) no funciona.
esto devuelve la barra de herramientas de ActionBar:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewGroup actionBar = getActionBar(getWindow().getDecorView());
TextView actionBarTitle = (TextView) actionBar.getChildAt(0);
}
public ViewGroup getActionBar(View view) {
try {
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
if (viewGroup instanceof android.support.v7.widget.Toolbar) {
return viewGroup;
}
for (int i = 0; i < viewGroup.getChildCount(); i++) {
ViewGroup actionBar = getActionBar(viewGroup.getChildAt(i));
if (actionBar != null) {
return actionBar;
}
}
}
} catch (Exception e) {
}
return null;
}