私自身の質問に対して私が思いつくことができる最良の答え(回避策)。
まず、この例に従って、 myActionBar
が分割されているかどうかを知る必要があります。これは、デフォルトの進行状況バーを使用するかどうかを決定するためのものです。が分割されると、カスタム プログレス バーが の下部に表示されますが、これは望ましくありません。ActionBar
ActionBar
ActionBar
/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);
}
}
}