HoneyComb用にアプリケーションの一部を調整しようとしています。
私が直面している問題は、オリエンテーションの変更(風景/肖像)に関する私の活動の破壊です。
クラシックアクティビティを使用していたとき、マニフェストに次のように書きました。
しかし、現在、これらの行はすべて機能していません!
そのための回避策はありますか?
私のコード:
<activity Android:name=".TwitterActivity" Android:label="@string/app_name"
Android:configChanges="keyboardHidden|orientation" />
<activity Android:name=".TwitterActivity$AppListFragment"
Android:configChanges="keyboardHidden|orientation" />
Honeycomb 3.0と互換性ライブラリ(r1)での経験に基づいています。
configChange="orientation"
は、方向の変更時にアクティビティ(適用先)が再作成されるのを防ぐことに関して、フラグメントを処理します。アクティビティの再作成時にfragment
を再作成しない場合は、setRetainInstance
でonCreate
を呼び出します。
何かを逃さない限り、2番目のマニフェストエントリを取得できません。AppListFragment
a Fragment
ではありませんか。もしそうなら、なぜそれはあなたのマニフェストのエントリとしてリストされていますか?
SDK 13をターゲットにしている場合にこれを引き起こす可能性が高い新しい修飾子については、 SO Answer を参照してくださいAndroid:configChanges="orientation|screenSize"
私は非常に似た問題を抱えていましたが、さまざまなバージョン(ICSを含む)で動作させるためにいくつかの追加を行わなければなりませんでした。
メインのアプリアクティビティでは、Jasonが提供するもののわずかに異なるバージョンを追加しました。
<activity
Android:name=".MyMainActivity"
Android:configChanges="orientation|keyboardHidden|screenSize"
Android:label="@string/app_name" >
私はこれをハニカム前に取り組んでいた:
<activity
....
Android:configChanges="orientation|keyboardHidden"
.... >
すべてのバージョンで実行するには、最初の例を作成する必要がありました。現在、後方互換性のためにフラグメントとActionBarSherlockを使用しています。
また、保存と再読み込みの方法を変更しました。
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Set up webview object
View v = inflater.inflate(R.layout.webview_layout, container, false);
webview = (WebView)v.findViewById(R.id.webview_fragment);
webview.getSettings().setJavaScriptEnabled(true);
// Check to see if it has been saved and restore it if true
if(savedInstanceState != null)
{
if (savedInstanceState.isEmpty())
Log.i(tag, "Can't restore state because bundle is empty.");
else
{
if (webview.restoreState(savedInstanceState) == null)
Log.i(tag, "Restoring state FAILED!");
else
Log.i(tag, "Restoring state succeeded.");
}
}
else
{
// Load web page
webview.setWebViewClient(new MyWebViewClient());
webview.getSettings().setPluginsEnabled(true);
webview.getSettings().setBuiltInZoomControls(false);
webview.getSettings().setSupportZoom(false);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.getSettings().setAllowFileAccess(true);
webview.getSettings().setDomStorageEnabled(true);
webview.loadUrl(mTabURL);
}
return v;
}
インスタンス状態の保存メソッドのコード:
@Override
public void onSaveInstanceState(Bundle outState)
{
if(webview.saveState(outState) == null)
Log.i(tag,"Saving state FAILED!");
else
Log.i(tag, "Saving state succeeded.");
}
お役に立てれば。
API 13までは、configChanges属性に新しい値screenSize
がありました
したがって、大画面を使用している場合は、configChanges属性にscreenSizeを追加してください。
Android:configChanges="orientation|keyboardHidden|screenSize"
Android 3.2(APIレベル13)で始まる、デバイスが縦向きと横向きを切り替えると、「画面サイズ」も変更されます。したがって、向きの変更によるランタイムの再起動を防止する場合APIレベル13以上(minSdkVersionおよびtargetSdkVersion属性で宣言)向けに開発する場合、「向き」値に加えて「画面サイズ」値を含める必要があります。つまり、Android:configChanges = "orientation | screenSize"をデカールする必要がありますただし、アプリケーションがAPIレベル12以下を対象とする場合、アクティビティは常にこの設定変更を処理します(Android 3.2以上で実行している場合でも、この設定変更はアクティビティを再開しませんデバイス)。
フラグメントがなくても、これと同じ問題(アクティビティの再起動)が発生していました。
私が変更され:
Android:configChanges="orientation|keyboardHidden"
に:
Android:configChanges="orientation|keyboardHidden|screenSize"
これにより、アクティビティの再起動が防止されます。
私はこれがかなり遅い回答であることを知っていますが、最近この問題に直面し、フラグメントアクティビティについてこれを解決することができました。
1)マニフェストでは、
Android:configChanges="orientation|keyboardHidden|screenSize"
2)クラスファイルで、onSaveInstanceState(Bundle outState)をオーバーライドします。それでおしまい!楽しい :)
マニフェストファイルで、アクティビティ内にこの行を追加します
Android:configChanges = "keyboard | keyboardHidden | orientation | screenSize"。