【发布时间】:2011-07-23 16:47:30
【问题描述】:
我正在尝试将自定义 ActionView 添加到我的 ActionBar。
我正在尝试添加通用刷新按钮。 (ImageButton,ProgressBar 在 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的来源:
<?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的源代码:
<?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 类中将clickListener 设置为ImageView,它就会被调用。
有人已经这样做了吗?
【问题讨论】:
-
“我正在尝试添加通用刷新按钮。(ImageButton,FrameLayout 内的 ProgressBar)但如果我使用 ActionView,则永远不会调用 onOptionsItemSelected()。” - 是什么让你认为它应该被调用?它不再是一个菜单选项——它是你的自定义
View——所以我不希望onOptionsItemSelected()被调用。 -
@CommonsWare:为什么不呢?该视图是现有菜单项的
ActionView。menu.findItem(R.id.messages_refresh).getActionView();返回正确的视图。如果您说的是正确的,Gmail 应用程序是如何做到的?你认为他们设置了clickListener并且自定义视图会以某种方式通知Activity? -
这是我的猜测。想一想:假设我有一个 17 个按钮的动作视图。他们都会触发
onOptionsItemSelected()吗?如果是这样,您将如何区分它们?
标签: android android-3.0-honeycomb actionview