web-dev-qa-db-ja.com

カスタムアクションビューはクリックできません

カスタムActionViewActionBarに追加しようとしています。

共通の更新ボタンを追加しようとしています。 (ImageButtonProgressBarFrameLayout内)しかし、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クラス内のImageViewRefreshViewを設定すると、呼び出されます。

誰かがこれをすでにしましたか?

22
Macarse

http://code.google.com/p/styled-action-bar/ のsrcコードを使用することになりました。

4
Macarse

onOptionsItemSelected()は、アクションアイテムがオーバーフローメニューにあり、これも処理する必要がある場合にのみ呼び出す必要があります。 (アクションバーで「常に」強制されるため、onOptionsItemSelected()は呼び出されません)。

膨らませた後のonCreateOptionsMenu()で、メニュー項目にOnMenuItemClickListenerを設定する必要があります。

8
CEO

私は私のために働く解決策を見つけました、そして私はあなたとそれを共有したいと思います。これは(@Macarse)の最初のアプローチに基づいていますが、いくつかの重要な変更が加えられています。

重要:それに応じてinitViewメソッドを適応させます

  1. onClickListenerをImageView(mButton)に設定します

  2. 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();
            }
        });
    }
    
  3. Reactアクティビティのクリックに応じて(MyActivity

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

私のアプローチが、実用的な解決策を見つける時間を節約できることを願っています!

1
droide_91