para - manual de programacion android pdf
Vista de acción personalizada no se puede hacer clic (3)
He encontrado una solución de trabajo para mí y quiero compartirla con ustedes. Se basa en el primer enfoque de (@Macarse), con algunos cambios importantes.
Importante: adapta el método initView en consecuencia
Establecer un onClickListener en el ImageView ( mButton )
Configure la carga como verdadera e informe a la Actividad ( MyActivity ) sobre el clic
private void initView(final Context context) { final LayoutInflater inflator = LayoutInflater.from(context); final View actionView = inflator.inflate( R.layout.action_refresh_progress, this); mProgressBar = (ProgressBar) actionView .findViewById(R.id.action_refresh_progress); mButton = (ImageView) actionView .findViewById(R.id.action_refresh_button); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(final View view) { setLoading(true); ((MyActivity) context).handleRefreshButtonClick(); } }); }
Reaccionar en consecuencia al clic en la actividad ( MyActivity ).
public void handleRefreshButtonClick() { // Start refreshing... }
¡Espero que mi enfoque pueda ahorrarle tiempo buscando una solución de trabajo!
Estoy tratando de agregar un ActionView
personalizado a mi ActionBar
.
Estoy tratando de agregar el botón de actualización común. ( ImageButton
, ProgressBar
dentro de un FrameLayout
) pero si uso un ActionView
onOptionsItemSelected()
nunca se llama.
Aquí está el código:
En mi Activity
:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.messages_actionbar, menu);
mRefreshView = (RefreshView) menu.findItem(R.id.messages_refresh).getActionView();
return super.onCreateOptionsMenu(menu);
}
src de messages_actionbar
''s
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/messages_refresh"
android:title="title"
android:icon="@drawable/icon"
android:showAsAction="always"
android:actionViewClass="com.blabla.RefreshView"/>
</menu>
RefreshView
de RefreshView
:
public class RefreshView extends FrameLayout {
private ImageView mButton;
private ProgressBar mProgressBar;
private boolean mLoading;
public RefreshView(Context context) {
super(context, null);
initView(context);
}
public RefreshView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
initView(context);
}
public RefreshView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}
private void initView(Context context) {
LayoutInflater inflator = LayoutInflater.from(context);
View v = inflator.inflate(R.layout.actionbar_refresh, this);
mProgressBar = (ProgressBar) v.findViewById(R.id.action_refresh_progress);
mButton = (ImageView) v.findViewById(R.id.action_refresh_button);
}
public void setLoading(boolean loading) {
if (loading != mLoading) {
mProgressBar.setVisibility(loading ? View.VISIBLE : View.GONE);
mButton.setVisibility(loading ? View.GONE : View.VISIBLE);
mLoading = loading;
}
}
}
código src de actionbar_refresh
:
<?xml version="1.0" encoding="utf-8" ?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/action_refresh_button"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:scaleType="center"
android:background="@drawable/icon" />
<ProgressBar
android:id="@+id/action_refresh_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"
android:indeterminate="true" />
</FrameLayout>
Por otro lado, si configuro un clickListener
a ImageView
dentro de la clase RefreshView
, se llama.
Alguien hizo esto ya?
Terminé usando el código src de http://code.google.com/p/styled-action-bar/ .
onOptionsItemSelected()
solo debe llamarse si el elemento de acción está en el menú de desbordamiento que también debe manejar. (lo tienes forzado a "siempre" en la barra de acción, por lo que onOptionsItemSelected()
no será llamado).
En onCreateOptionsMenu()
después de inflar, debe configurar un OnMenuItemClickListener
para el elemento de menú.