2.xの物理デバイスと仮想デバイスでテスト済み。v3ではテストされていません>
アプリが起動すると、ポートレートモードまたはランドスケープモードのいずれかで、プログレスバーがアクションバーに正常に表示されます。向きの変更に続いてFragmentActivityが再起動した後、進行状況は、以下のonCreateコードから呼び出されたか(ローダーが実行され、コードが進行状況バーをBoolean.TRUEに設定するようにステップインすることを確認しました)、または単純なボタンクリックイベントからsetProgressBarIndeterminateVisibility(Boolean.TRUE);
onSaveInstanceState-> onCreateメソッドは方向の変更時に実行されるため、FragmentActivityは停止/開始されます。
参照をチェックして、android.support.v4.viewを使用していることを確認しました。また、タブ/フラグメントでViewPagerIndicatorを使用します。これには関係がないはずです。
フラグメントによってアクションバーに追加された更新ボタンは、方向の変更/FragmentActivityの再起動後に正常に表示されます。
実は...向きを変えた後のlogcatのデバッグを見て奇妙なことに気づきました。FragmentActivityは、ログに書き込まれた行を2回確認し始め、onSaveInstanceStateが再度呼び出され、続いて別のonCreateが呼び出されるようです。
01-28 10:25:45.446: D/DonorDetailsContainerFragmentActivity(4728): onCreate
01-28 10:26:02.457: D/DonorDetailsContainerFragmentActivity(4728): loaderHasStarted
01-28 10:26:02.457: D/DonorDetailsContainerFragmentActivity(4728): onCreateLoader 0
01-28 10:26:04.437: D/DonorDetailsContainerFragmentActivity(4728): onLoadFinished 0
01-28 10:26:04.447: D/DonorDetailsContainerFragmentActivity(4728): loaderHasFinished
**Flip to landscape here**
01-28 10:29:07.567: D/DonorDetailsContainerFragmentActivity(4728): onSaveInstanceState
01-28 10:29:08.197: D/DonorDetailsContainerFragmentActivity(4728): onCreate
01-28 10:29:08.427: D/DonorDetailsContainerFragmentActivity(4728): loaderHasStarted
01-28 10:29:08.427: D/DonorDetailsContainerFragmentActivity(4728): onCreateLoader 0
**Nothing happened here - I only changed orientation once**
01-28 10:29:08.458: D/DonorDetailsContainerFragmentActivity(4728): onSaveInstanceState
01-28 10:29:08.686: D/DonorDetailsContainerFragmentActivity(4728): onCreate
01-28 10:29:17.236: D/DonorDetailsContainerFragmentActivity(4728): onLoadFinished 0
01-28 10:29:17.236: D/DonorDetailsContainerFragmentActivity(4728): loaderHasFinished
public class DonorDetailsContainerFragmentActivity extends FragmentActivity
implements OnLoaderListener,
LoaderManager.LoaderCallbacks<LoaderStatus> {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// This has to be called before setContentView and you must use the
// class in android.support.v4.view and NOT android.view
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);
Log.d(LOG_TAG, "onCreate");
mAdapter = new ViewPagerTitleAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.tabindicator);
indicator.setViewPager(mPager);
// first check if we already have a running loader
if ((savedInstanceState != null)
&& savedInstanceState.containsKey("RUNNING_LOADERS")) {
mRunningLoaders = savedInstanceState.getParcelable("RUNNING_LOADERS");
}
if (mRunningLoaders == null) {
mRunningLoaders = new RunningLoadersList();
}
if (mRunningLoaders != null) {
for (int i = 0; i < mRunningLoaders.size(); i++) {
StartLoader(mRunningLoaders.get(i).id,
mRunningLoaders.get(i).args);
}
}
if (getSupportLoaderManager().hasRunningLoaders()) {
setProgressBarIndeterminateVisibility(Boolean.TRUE);
} else {
setProgressBarIndeterminateVisibility(Boolean.FALSE);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("RUNNING_LOADERS", mRunningLoaders);
Log.d(LOG_TAG, "onSaveInstanceState");
}
Nothing particularly interesting in the manifest.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.savant.donordetailsviewpagertitle"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="13"/>
<!-- Enable access to the the internet -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Enable access to the the network state -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name="com.savant.donordetailsviewpagertitle.classes.DonorDetailsViewPagerTitle"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/StyledIndicators">
<activity android:name=".activities.DonorDetailsContainerFragmentActivity"
android:label="@string/app_name">
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>