我正在尝试向自己的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
的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>
另一方面,如果我将clickListener
设置为ImageView
类中的RefreshView
,则会调用它。
任何人都已经这样做了吗?
答案 0 :(得分:8)
onOptionsItemSelected()
。 (你必须在操作栏上“永远”,所以onOptionsItemSelected()
不会被调用。)
充气后onCreateOptionsMenu()
,您必须为菜单项设置OnMenuItemClickListener
。
答案 1 :(得分:4)
我最终使用了来自http://code.google.com/p/styled-action-bar/的src代码。
答案 2 :(得分:1)
我为我找到了一个有效的解决方案,我希望与您分享。它基于(@Macarse)的第一种方法,有一些重要的变化。
重要提示:相应地调整 initView 方法
将 onClickListener 设置为ImageView( mButton )
将加载设置为true&amp;告知活动( 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();
}
});
}
反应相应于活动中的点击次数( MyActivity )
public void handleRefreshButtonClick() {
// Start refreshing...
}
我希望我的方法能为您节省一些时间找到有效的解决方案!