无法单击自定义操作视图

时间:2011-03-26 23:31:05

标签: android android-3.0-honeycomb actionview

我正在尝试向自己的ActionView添加自定义ActionBar

我正在尝试添加常用刷新按钮。 (ImageButton内部ProgressBarFrameLayout但如果我使用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,则会调用它。

任何人都已经这样做了吗?

3 个答案:

答案 0 :(得分:8)

只有当操作项位于您应该处理的溢出菜单中时,才应调用

onOptionsItemSelected()。 (你必须在操作栏上“永远”,所以onOptionsItemSelected()不会被调用。)

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

答案 1 :(得分:4)

我最终使用了来自http://code.google.com/p/styled-action-bar/的src代码。

答案 2 :(得分:1)

我为我找到了一个有效的解决方案,我希望与您分享。它基于(@Macarse)的第一种方法,有一些重要的变化。

重要提示:相应地调整 initView 方法

  1. onClickListener 设置为ImageView( mButton

  2. 加载设置为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();
            }
        });
    }
    
  3. 反应相应于活动中的点击次数( MyActivity

    public void handleRefreshButtonClick() {
        // Start refreshing...
    }
    
  4. 我希望我的方法能为您节省一些时间找到有效的解决方案!