访问ActionBar内的视图

3

我正在尝试向我的视图添加水平进度条,方法如下:

res/menu.xml

<item   android:id="@+id/menuItemProgress"
        android:title="Progress"
        android:actionLayout="@layout/component_cancellable_progressbar"
        android:showAsAction="always"/>

component_cancellable_progressbar.xml

<FrameLayout    xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/searchProgressWrapper"
                android:layout_height="wrap_content" 
                android:layout_width="wrap_content">
<ProgressBar    android:id="@+id/searchProgress"
                android:layout_height="30dp"
                android:layout_width="150dp"
                style="@style/Custom.Widget.ProgressBar.Horizontal"
                android:max="100" />
<ImageView      android:id="@+id/cancelSearch"
                android:layout_height="wrap_content" 
                android:layout_width="wrap_content"
                android:paddingRight="8dp" 
                android:layout_gravity="right|center_vertical" 
                android:src="@android:drawable/ic_notification_clear_all"
                android:scaleType="fitXY" />
</FrameLayout>

我该如何从操作内部访问此进度条(使其可见/不可见/显示进度)?
4个回答

5

可以获取操作项的视图。

但是请注意,有时操作项可能在溢出菜单中,因此您可能会得到 null。

那么,如何做到呢?

以下是示例代码:

public boolean onCreateOptionsMenu(final Menu menu) {
  getSupportMenuInflater().inflate(R.menu.main, menu);
  new Handler().post(new Runnable() {
    @Override
    public void run() {
      final View syncItemView = findViewById(R.id.action_search);
      ...

这是在使用actionBarSherlock库时测试的,适用于Android 4.1.2和Android 2.3.5。

另一种选择是使用更广泛的方法,如showcaseView库所使用的这里


1
这解决了我的问题。使用处理程序是必要的,以确保菜单项已被添加到视图层次结构中(通过在onCreateOptionsMenu()完成后排队等待)。 - d370urn3ur

2
您可以重写onCreateOptionsMenu方法,并在其中捕获您的视图:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
  menu.getItem(0).getActionView();
  ...

或者通过搜索ID

View v = (View) menu.findItem(R.id.search).getActionView();

我在操作栏中插入了自定义下拉菜单,并通过这种方式控制它。


2

在 onCreate() 方法之后,您可以像平常一样通过 findViewById() 访问它。问题是由其他原因引起的。


你介意记录一下这种行为的根本原因吗? - Necronet
@max4ever 确保它已经被创建。可能需要使用 postDelayed 方法等待 AB 项视图渲染完成。 - Artem L
抱歉,我最终厌倦了使用标准的Android API来处理ActionBar,于是我创建了自己的定制实现。这并不难,我建议任何在ActionBar上使用有趣功能的中大型应用程序的人都可以尝试一下。 - Graeme

-1
以下是一个非常有用的链接,可以帮助你实现actionBar。希望你能够实现自己想要的功能。

http://thiranjith.wordpress.com/2011/07/15/actionbar-design-pattern-example-for-android/

public class ActionBar extends FrameLayout {

      private ProgressBar mProgress;



      public ActionBar(Context context, AttributeSet attrs) {

        super(context, attrs);

        mInflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       FrameLayout barView = (RelativeLayout) mInflater.inflate(R.layout.actionbar, null);

        addView(barView);

       mProgress = (ProgressBar) barView.findViewById(R.id.actionbar_progress);

    public void showProgressBar() { ... }

    public void hideProgressBar() { ... }

    public boolean isProgressBarVisible() { ... }


}

然后从您的活动中控制进度条,如下所示。

public class MainActivity extends Activity {

    private ActionBar mActionBar;



    @Override

    public void onCreate(Bundle savedInstanceState) {
        mActionBar = (ActionBar) findViewById(R.id.actionBar);

        mActionBar.showProgressbar()

     }

}

抱歉,它不行。我正在尝试找出如何在v11 ActionBar组件中查找视图,而不是“自己构建”的操作栏。 - Graeme
我想知道如何访问android.app.ActionBar中附加的视图,而不是自定义ActionBar中的视图。 - Graeme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接