在操作栏中显示刷新消息

时间:2014-04-17 23:35:17

标签: android android-actionbar

我在我的Android应用程序中使用了一个Action Bar(一个常规的,而不是sherlock),当应用程序打开时,我想在操作栏中显示一条刷新的消息。这意味着我想要隐藏菜单项和标题(类似于GMail应用在刷新时的显示方式)。

最佳方法是什么?它是否使用了上下文操作栏?

是否可以在操作栏下方显示刷新动画,例如在GMail应用程序中(即蓝线滑过)。

我知道我可以使用第三方pull-to-refresh,但我不想使用它(因为我不需要使用pull-to-refresh功能)。

我的目标是Jelly Bean和更新的设备。

谢谢!

1 个答案:

答案 0 :(得分:5)

  

我想隐藏菜单项和标题(类似于GMail应用程序的方式   在它令人耳目一新时出现。

可以使用WindowManager.addView(View, LayoutParams)完成此操作。这是一个在ActionBar之上显示消息的示例,该消息可以让您对如何继续进行非常可靠的了解。

布局

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/message"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:textColor="@android:color/white"
    android:textSize="18sp" />

<强>实施

/** The attribute depicting the size of the {@link ActionBar} */
private static final int[] ACTION_BAR_SIZE = new int[] {
        android.R.attr.actionBarSize
};

/** The notification layout */
private TextView mMessage;

private void showLoadingMessage() {
    // Remove any previous notifications
    removeLoadingMessage();

    // Initialize the layout
    if (mMessage == null) {
        final LayoutInflater inflater = getLayoutInflater();
        mMessage = (TextView) inflater.inflate(R.layout.your_layout, null);
        mMessage.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_dark));
        mMessage.setText("Loading...");
    }

    // Add the View to the Window
    getWindowManager().addView(mMessage, getActionBarLayoutParams());
}

private void removeLoadingMessage() {
    if (mMessage != null && mMessage.getWindowToken() != null) {
        getWindowManager().removeViewImmediate(mMessage);
        mMessage = null;
    }
}

/**
 * To use, @see {@link WindowManager#addView(View, LayoutParams)}
 * 
 * @return The {@link WindowManager.LayoutParams} to assign to a
 *         {@link View} that can be placed on top of the {@link ActionBar}
 */
private WindowManager.LayoutParams getActionBarLayoutParams() {
    // Retrieve the height of the status bar
    final Rect rect = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
    final int statusBarHeight = rect.top;

    // Retrieve the height of the ActionBar
    final TypedArray actionBarSize = obtainStyledAttributes(ACTION_BAR_SIZE);
    final int actionBarHeight = actionBarSize.getDimensionPixelSize(0, 0);
    actionBarSize.recycle();

    // Create the LayoutParams for the View
    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            LayoutParams.MATCH_PARENT, actionBarHeight,
            WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.TOP;
    params.x = 0;
    params.y = statusBarHeight;
    return params;
}

<强>结果

Example

<强>结论

这种实现与Gmail和其他应用程序非常相似,减去了拉动刷新模式。

当您致电showLoadingMessage时,请发布Runnable或使用View.OnClickListener。您不想过早致电WindowManager.addView,或者您要抛出WindowManager.BadTokenException。另外,在removeLoadingMessage中致电Activity.onDestroy非常重要,否则您可能会泄漏View Window的费用。