カスタム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
を設定すると、呼び出されます。
誰かがこれをすでにしましたか?
http://code.google.com/p/styled-action-bar/ のsrcコードを使用することになりました。
onOptionsItemSelected()
は、アクションアイテムがオーバーフローメニューにあり、これも処理する必要がある場合にのみ呼び出す必要があります。 (アクションバーで「常に」強制されるため、onOptionsItemSelected()
は呼び出されません)。
膨らませた後のonCreateOptionsMenu()
で、メニュー項目にOnMenuItemClickListener
を設定する必要があります。
私は私のために働く解決策を見つけました、そして私はあなたとそれを共有したいと思います。これは(@Macarse)の最初のアプローチに基づいていますが、いくつかの重要な変更が加えられています。
重要:それに応じてinitViewメソッドを適応させます
onClickListenerをImageView(mButton)に設定します
loadingを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();
}
});
}
Reactアクティビティのクリックに応じて(MyActivity)
public void handleRefreshButtonClick() {
// Start refreshing...
}
私のアプローチが、実用的な解決策を見つける時間を節約できることを願っています!