【问题标题】:ActionBarSherlock - Indeterminate ProgressActionBarSherlock - 不确定的进度
【发布时间】:2012-09-06 17:43:41
【问题描述】:

很明显,要显示/隐藏不确定的进度,您必须使用此方法:

itemMenu.setActionView(...);

所以:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_refresh:
            item.setActionView(R.layout.indeterminate_progress_action);
            runAsyncTask();
    ...
    }
}

我不清楚的是:如何将动作视图设置回 null。我不想保留对 MenuItem 的引用,我认为这是不正确的,因为我不想假设有关 OptionsMenu 生命周期的任何事情。

我应该如何在 onPostExecute 上将操作视图设置为 null?

【问题讨论】:

    标签: android android-actionbar


    【解决方案1】:

    我是这样做的:

    refresh = false; // the future state of your indeterminate progress
    invalidateOptionsMenu(); // trigger the recreation of the menu and call onCreateOptionsMenu(Menu)
    

    然后在你的 onCreateOptionsMenu(Menu) 方法中:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
    {
        super.onCreateOptionsMenu(menu, inflater);
    
        MenuItem refreshItem = menu.add(Menu.NONE, R.id.action_bar_refresh, 1, "Refresh");
        refreshItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
    
        if(refresh)
            refreshItem.setActionView(R.layout.indeterminate_progress_action);
        else
            refreshItem.setIcon(R.drawable.ic_menu_refresh);
    }
    

    【讨论】:

      【解决方案2】:

      invalidateOptionsMenu() 怎么样?那么您的onCreateOptionsMenu() 可能总是将其设置为null

      【讨论】:

      • 它可以工作。您对刷新 onPrepareOptionsMenu 上的参考有何看法?
      • @gwa:如果你的意思是把它设置在null 那里而不是onCreateOptionsMenu(),那可能会奏效,尽管我不知道你通过这种方法获得了什么。
      • 仍然对此感到困惑。我会尝试更多地挖掘。谢谢
      【解决方案3】:

      我相信你可以在那个 MenuItem 上调用 setActionView(null)

      然后用invalidateOptionsMenu()刷新ActionBar

      【讨论】:

        【解决方案4】:

        如果您不想这样做,则无需操作特定的菜单项。

        我使用了一种不同的方法,该方法利用了系统的不确定进度条功能(已移植到 ActionBarSherlock)。我在这里解释它是为了为未来的读者提供更多选择,让他们使用最适合他们的方式。


        我的基本片段有一个我调用的方法来打开和关闭我的加载 UI。这是一个精简版:

        private void setLoading(final boolean isLoading)
        {
            final SherlockFragmentActivity sherlockActivity = getSherlockActivity();
            sherlockActivity.runOnUiThread(new Runnable()
            {
                public void run()
                {
                    // show loading progress bar
                    sherlockActivity
                        .setSupportProgressBarIndeterminateVisibility(isLoading);
        
                    // hide the rest of the menu
                    setMenuVisibility(!isLoading);
                }
            });
        }
        

        为此,您的活动必须配置为使用正确的样式 - 从您的 SherlockFragmentActivity.onCreate() 方法调用它:

        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        

        最后一个技巧是,在 HoneyComb 之前的设备上,这会导致进度条在默认情况下立即显示(而不是在 HC 及更高版本中默认隐藏)。

        • 您必须将其设置为不可见
        • 您还必须创建一个 Sherlock 操作栏实例,此代码才能运行

        onCreate() 就这样变成了:

        protected void onCreate(Bundle arg0)
        {
            super.onCreate(arg0);
        
            // allow window to show progress spinner in the action bar
            requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
            getSupportActionBar();
            setSupportProgressBarIndeterminateVisibility(false); 
        }
        

        有关此的更多详细信息,您可以查看我的回答

        【讨论】:

          【解决方案5】:

          如果您不想保留对菜单项的引用,那么您可以简单地保留对 Menu 对象的引用。保证对菜单的引用一直有效,直到下次调用文档 (http://developer.android.com/reference/android/app/Activity.html#onCreateOptionsMenu(android.view.Menu)) 中提到的 onCreateOptionsMenu()

          然后调用:

          MenuItem menuItem = mMenu.findItem(R.id.favourite_payment);
          menuItem.setActionView(null);
          

          或者,如果使用 AppCompat:

          MenuItem menuItem = mMenu.findItem(R.id.favourite_payment);
          MenuItemCompat.setActionView(menuItem, null);
          

          无需拨打invalidateOptionsMenu()

          【讨论】:

            猜你喜欢
            • 2014-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多