私は現在、iPhoneアプリをAndroidに移植していますが、フラグメントの手がかりがなかったので、それらを試してみると思ったので、いくつかのクラス(ユーザーに提示されるビューごとに1つ、すべて拡張ベースクラスフラグメント)とそれぞれを作成しましたxmlレイアウト。起動時に表示されるフラグメントについては、以下のコードを参照してください。すべてのフラグメントにシングルトンを使用します。
public class FragWelcome extends Fragment {
private static FragWelcome _fs;
OnClickListener mListener;
public FragWelcome() {}
public static FragWelcome getFrag() {
if(FragWelcome._fs==null) _fs=new FragWelcome();
return _fs;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnClickListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnClickListener");
}
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.frag_welcome, container, false);
((Button)v.findViewById(R.id.btnCreateNewList)).setOnClickListener(mListener);
((Button)v.findViewById(R.id.btnEditOldList)).setOnClickListener(mListener);
return v;
}
}
次に、次のようなメソッドを使用してFragmentManagerクラスを作成します。
public void addFragment(int container, Fragment f,int fadein,int fadeout, boolean addtobackstack,String tag) {
this._currentFragment=f;
this._fragTrans=this._fragMan.beginTransaction();
this._fragTrans.setCustomAnimations(fadein, fadeout);
this._fragTrans.add(container, f ,tag);
if(addtobackstack) this._fragTrans.addToBackStack(tag);
this._fragTrans.commit();
}
public void replaceFragment(int container, Fragment f,int fadein,int fadeout, boolean addtobackstack,String tag) {
this._currentFragment=f;
this._fragTrans=this._fragMan.beginTransaction();
this._fragTrans.setCustomAnimations(fadein, fadeout);
this._fragTrans.replace(container, f ,tag);
if(addtobackstack) this._fragTrans.addToBackStack(tag);
this._fragTrans.commit();
}
これは私のメインアクティビティクラスAC_MainのonCreateメソッドです。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_main);
this.setTitle("Willkommen");
FragMan.getSharedFragMan(this).addFragment(R.id.llMain,FragWelcome.getFrag(),R.animator.fade_in,R.animator.fade_out,false,"frag_welcome");
}
私は何を言うことができますか....すべてが期待どおりに機能し、ただ素晴らしいです。エラーはまったくありません...アプリを2回起動しようとしない限り。
08-21 16:27:18.278: D/AndroidRuntime(21576): Shutting down VM
08-21 16:27:18.278: W/dalvikvm(21576): threadid=1: thread exiting with uncaught exception (group=0x40c351f8)
08-21 16:27:18.283: E/AndroidRuntime(21576): FATAL EXCEPTION: main
08-21 16:27:18.283: E/AndroidRuntime(21576): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.lochmann.einkaufsliste/de.lochmann.einkaufsliste.AC_Main}: j java.lang.IllegalStateException: Activity has been destroyed
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.ActivityThread.access$600(ActivityThread.java:127)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.os.Handler.dispatchMessage(Handler.java:99)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.os.Looper.loop(Looper.java:137)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.ActivityThread.main(ActivityThread.java:4507)
08-21 16:27:18.283: E/AndroidRuntime(21576): at java.lang.reflect.Method.invokeNative(Native Method)
08-21 16:27:18.283: E/AndroidRuntime(21576): at java.lang.reflect.Method.invoke(Method.java:511)
08-21 16:27:18.283: E/AndroidRuntime(21576): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
08-21 16:27:18.283: E/AndroidRuntime(21576): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
08-21 16:27:18.283: E/AndroidRuntime(21576): at dalvik.system.NativeStart.main(Native Method)
08-21 16:27:18.283: E/AndroidRuntime(21576): Caused by: java.lang.IllegalStateException: Activity has been destroyed
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1280)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.BackStackRecord.commit(BackStackRecord.java:525)
08-21 16:27:18.283: E/AndroidRuntime(21576): at de.lochmann.einkaufsliste.FragMan.addFragment(FragMan.java:41)
08-21 16:27:18.283: E/AndroidRuntime(21576): at de.lochmann.einkaufsliste.AC_Main.onCreate(AC_Main.java:124)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.Activity.performCreate(Activity.java:4465)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
08-21 16:27:18.283: E/AndroidRuntime(21576): ... 11 more
繰り返しになりますが、Eclipseからアプリを起動すると、Androidデバイス(Samsung Galaxy S2)のホームボタンを押してアプリに戻るまで、アプリは完全に安定しています。アプリをもう一度起動しようとすると、上記のエラーでクラッシュします。タスクマネージャーは、バックグラウンドで実行されなくなったと言います。だから私の質問は...私は何を間違っているのですか、誰かがあなた自身のアイデアや経験を持っていますか?どうもありがとう。
2回目にアプリがクラッシュしたかどうかを確認したところ、デバイスからアプリが停止したと表示されたので、3回目の試行でアプリを通常どおり実行できます。多分それはまだバックグラウンドにあり、断片が問題を引き起こしています...!?
すべてのライフサイクルメソッドを実装し、すべてのスーパーメソッドを呼び出した後、新しいLogCat出力を編集します。
08-21 17:17:09.043: I/dalvikvm(25725): Turning on JNI app bug workarounds for target SDK version 10...
08-21 17:17:09.108: I/Activity(25725): onCreate called
08-21 17:17:09.108: I/FragWelcome(25725): onAttach called
08-21 17:17:09.108: I/FragWelcome(25725): onCreate called
08-21 17:17:09.123: D/dalvikvm(25725): GC_FOR_ALLOC freed 86K, 3% free 8909K/9091K, paused 13ms
08-21 17:17:09.128: I/dalvikvm-heap(25725): Grow heap (frag case) to 11.061MB for 2432016-byte allocation
08-21 17:17:09.148: D/dalvikvm(25725): GC_CONCURRENT freed 1K, 3% free 11282K/11527K, paused 1ms+1ms
08-21 17:17:09.203: D/dalvikvm(25725): GC_FOR_ALLOC freed 0K, 3% free 11283K/11527K, paused 11ms
08-21 17:17:09.208: I/dalvikvm-heap(25725): Grow heap (frag case) to 16.278MB for 5472016-byte allocation
08-21 17:17:09.228: D/dalvikvm(25725): GC_CONCURRENT freed 0K, 2% free 16626K/16903K, paused 1ms+2ms
08-21 17:17:09.318: I/FragWelcome(25725): onCreateView called
08-21 17:17:09.318: I/FragWelcome(25725): onActivityCreated called
08-21 17:17:09.323: I/Activity(25725): onStart called
08-21 17:17:09.323: I/FragWelcome(25725): onStart called
08-21 17:17:09.323: I/Activity(25725): onResume called
08-21 17:17:09.323: I/FragWelcome(25725): onResume called
08-21 17:17:09.503: D/CLIPBOARD(25725): Hide Clipboard dialog at Starting input: finished by someone else... !
08-21 17:17:21.258: I/FragWelcome(25725): onPause called
08-21 17:17:21.258: I/Activity(25725): onPause called
08-21 17:17:21.438: D/CLIPBOARD(25725): Hide Clipboard dialog at Starting input: finished by someone else... !
08-21 17:17:21.908: I/FragWelcome(25725): onStop called
08-21 17:17:21.908: I/Activity(25725): onStop called
08-21 17:17:21.908: I/FragWelcome(25725): onDestroyView called
08-21 17:17:21.908: I/FragWelcome(25725): onDestroy called
08-21 17:17:21.913: I/FragWelcome(25725): onDetach called
08-21 17:17:21.913: I/Activity(25725): onDestroy called
08-21 17:17:32.833: I/Activity(25725): onCreate called
08-21 17:17:32.833: D/AndroidRuntime(25725): Shutting down VM
08-21 17:17:32.833: W/dalvikvm(25725): threadid=1: thread exiting with uncaught exception (group=0x40c351f8)
08-21 17:17:32.838: E/AndroidRuntime(25725): FATAL EXCEPTION: main
08-21 17:17:32.838: E/AndroidRuntime(25725): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.lochmann.einkaufsliste/de.lochmann.einkaufsliste.AC_Main}: java.lang.IllegalStateException: Activity has been destroyed
08-21 17:17:32.838: E/AndroidRuntime(25725): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
08-21 17:17:32.838: E/AndroidRuntime(25725): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
08-21 17:17:32.838: E/AndroidRuntime(25725): at android.app.ActivityThread.access$600(ActivityThread.java:127)
以前のlogcatから読んだのは、backstackrecord.commitの問題です...誰かがこれについて何か知っていますか?
08-21 16:27:18.283: E/AndroidRuntime(21576): Caused by: java.lang.IllegalStateException: Activity has been destroyed
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1280)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
08-21 16:27:18.283: E/AndroidRuntime(21576): at android.app.BackStackRecord.commit(BackStackRecord.java:525)
08-21 16:27:18.283: E/AndroidRuntime(21576): at de.lochmann.einkaufsliste.FragMan.addFragment(FragMan.java:41)
08-21 16:27:18.283: E/AndroidRuntime(21576): at de.lochmann.einkaufsliste.AC_Main.onCreate(AC_Main.java:124)