2

ActionBar表示されていなくてもスペースを占有するために、進行状況インジケーターが必要です。

私は使っている:

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarIndeterminateVisibility(true);

その後:

setProgressBarIndeterminateVisibility(false);

これにより、進行状況バーの可視性が に設定され、進行GONE状況INVISIBLEが完了するまで一時的にアプリのタイトルが削除されます。

アクションバーに空のアクションを追加することを考えています。これは、進行状況を示す前に削除し、終了したら再度追加できます。それを行うための別の面倒な方法はありますか?

4

1 に答える 1

0

私自身の質問に対して私が思いつくことができる最良の答え(回避策)。

まず、この例に従って、 myActionBarが分割されているかどうかを知る必要があります。これは、デフォルトの進行状況バーを使用するかどうかを決定するためのものです。が分割されると、カスタム プログレス バーが の下部に表示されますが、これは望ましくありません。ActionBarActionBarActionBar

/values/bools.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="split_action_bar">false</bool>
</resources>

/values-port/bools.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="split_action_bar">true</bool>
</resources>

/values-large/bools.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="split_action_bar">false</bool>
</resources>

私のアクティビティでは、次の値を取得します。

private boolean isActionBarSplitted() {
    return getResources().getBoolean(R.bool.split_action_bar);
}

MenuItemアプリが大型デバイス上にあるとき、または狭いデバイス上で横向きモードになっているときに使用するカスタム プログレス インジケーターを使用して、オプション メニューをセットアップしました。

/menu/options_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item 
        android:id="@+id/custom_progress_indicator"
        android:showAsAction="always"/>
    <item
        android:id="@+id/another_menu_item"
        android:icon="@android:drawable/btn_default"
        android:showAsAction="ifRoom"/>
    <item
        android:id="@+id/yet_another_menu_item"
        android:icon="@android:drawable/btn_default"
        android:showAsAction="ifRoom"/>
</menu>

私の では、Activityを取得しMenuItemて無効にするので、本当に見えなくなりますが、 ではありませんGONE

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    mCustomProgressIndicator = menu.findItem(R.id.custom_progress_indicator);
    mCustomProgressIndicator.setEnabled(false);
    return super.onPrepareOptionsMenu(menu);
}

カスタム進行状況インジケーターのレイアウト:

/layout/custom_progress_bar.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ProgressBar android:id="@+id/progress"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

進行状況を示す開始と停止の 2 つの関数があります。

/**
 * Indicates progress on the action bar
 */
private void startIndicatingProgress() {
    mIndicatingProgress = true;
    if (isActionBarSplitted()) {
        // if we have a split action bar, use the default progress indicator
        setProgressBarIndeterminateVisibility(true);
    } else {
        if (mCustomProgressIndicator != null) {
            // this function may get called during onResume where
            // mCustomProgressIndicator is not set

            LayoutInflater inflater = (LayoutInflater)
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View progressBarLayoutView = inflater.inflate(
                    R.layout.custom_progress_bar, null);
            View progressBar = progressBarLayoutView
                    .findViewById(R.id.progress);
            LayoutParams layoutParams = progressBar.getLayoutParams();

            // well now, not sure what the width of MenuItems is (since it
            // seems impossible to find out)
            // so adjusting the height of the ActionBar with 8, better than
            // to hardcode a value I guess
            layoutParams.width = actionBar.getHeight() + 8;
            mCustomProgressIndicator.setActionView(progressBarLayoutView);
        }
    }
}

/**
 * Returns true if the ActionBar is currently split
 * 
 * @return
 */
private boolean isActionBarSplitted() {
    return getResources().getBoolean(R.bool.split_action_bar);
}

/**
 * Stops indicating progress
 */
private void stopIndicatingProgress() {
    mIndicatingProgress = false;
    // always stop default progress indicator
    setProgressBarIndeterminateVisibility(false);
    // this function may get called in onResume where
    // mCustomProgressIndicator is not set
    if (mCustomProgressIndicator != null) {
        mCustomProgressIndicator.setActionView(null);
    }
}

これで問題ないと思うかもしれませんが、方向を変更するとカスタムProgressBarが縮小されるため、方向の変更を検出してカスタム プログレス バーをリセットする必要があります。小さなデバイスでは、アクティビティが次のようになっているため、デフォルトのプログレスバーとカスタムを切り替える必要があるため、これはとにかく私にとって良い考えですandroid:uiOptions="splitActionBarWhenNarrow":

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE
            || newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        if (mIndicatingProgress) {
            // restart indicating progress to avoid feature of shrinking
            // custom progress
            // bar and switch between custom and default if needed
            stopIndicatingProgress();
            startIndicatingProgress();
        }

        // also remove custom progress indicator if split action bar
        // so it won't take up space on the action bar when using
        // default progress indicator
        if (isActionBarSplitted()) {
            // this seems to be the equivalent of View.setVisibility(View.GONE)
            mCustomProgressIndicator.setVisible(false);
        } else {
            mCustomProgressIndicator.setVisible(true);
        }
    }
}
于 2013-08-30T14:20:11.270 に答える