La vue d'action personnalisée ne peut pas être cliquée

J'essaie d'ajouter un ActionView personnalisé à mon ActionBar .

J'essaie d'ajouter le bouton de rafraîchissement commun. ( ImageButton , ProgressBar dans FrameLayout ) mais si j'utilise ActionView onOptionsItemSelected() n'est jamais appelé.

  • Désinstallation d'Android ADT
  • Comment ajouter un TextView au-dessus d'un FloatingActionButton dans Android
  • Android Intention de démarrer Activité principale de l'application
  • Différence entre ApplicationInfo et PackageInfo?
  • Filtrer Google Places remplit automatiquement les résultats par pays
  • Android Studio: qu'est-ce qui provoque les journaux d'alimentation de la batterie Logcat?
  • Voici le code:

    Dans mon 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 :

     <?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> 

    Le code 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; } } } 

    actionbar_refresh 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> 

    D'autre part, si je définis un clickListener à l' ImageView dans la classe RefreshView , il est appelé.

    Quelqu'un at-il déjà fait cela?

    3 Solutions collect form web for “La vue d'action personnalisée ne peut pas être cliquée”

    onOptionsItemSelected() ne doit être appelé que si l'élément d'action se trouve dans le menu de débordement que vous devez également gérer. (Vous l'avez forcé de "toujours" sur la barre d'action, alors onOptionsItemSelected() ne sera pas appelé).

    À onCreateOptionsMenu() après avoir gonflé, vous devez configurer un OnMenuItemClickListener pour l'élément de menu.

    J'ai fini par utiliser le code src de http://code.google.com/p/styled-action-bar/ .

    J'ai trouvé une solution de travail pour moi et je veux le partager avec vous. Il est basé sur la première approche de (@Macarse), avec quelques changements importants.

    Important: adaptez la méthode initView en conséquence

    1. Définissez un OnClickListener sur ImageView ( mButton )

    2. Configurez le chargement sur true et informez l'activité ( MyActivity ) sur le 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(); } }); } 
    3. Réagissez en conséquence au clic dans l'activité ( MyActivity )

       public void handleRefreshButtonClick() { // Start refreshing... } 

    J'espère que ma démarche pourrait vous faire gagner du temps pour trouver une solution de travail!

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.