自定义操作视图不能被点击

我想添加一个自定义的ActionView到我的ActionBar

我正在尝试添加通用刷新button。 ( ImageButtonProgressBar里面的FrameLayout ),但如果我使用ActionView onOptionsItemSelected()永远不会被调用。

代码如下:

在我的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); } 

messages_actionbar的src:

 <?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的代码:

 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代码:

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

另一方面,如果我将RefreshView设置为RefreshView类中的ImageView ,它将被调用。

任何人已经这样做了?

Solutions Collecting From Web of "自定义操作视图不能被点击"

onOptionsItemSelected()只应该被调用,如果行动项目在你也应该处理的溢出菜单。 (你不得不在操作栏上“始终”,所以onOptionsItemSelected()不会被调用)。

在充气后的onCreateOptionsMenu() ,您必须设置菜单项的OnMenuItemClickListener

我为我find了一个可行的解决scheme,我想和你分享。 它基于(@Macarse)的第一种方法,并进行了一些重要的更改。

重要:相应地调整initView方法

  1. onClickListener设置为ImageView( mButton

  2. 加载设置为true并通知活动( MyActivity )有关点击

     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. 根据Activity( MyActivity )中的点击进行相应的反应

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

我希望我的方法可以为您节省一些时间find一个工作的解决scheme!