我目前移植一个iPhone应用程序到Android和我没有,我想我该怎么跟他们尝试碎片的线索,所以我创建几个类(一个用于psented用户每个视图这就是$ P $,上延伸基类片段)和相应的XML布局。 code以下为对发射显示的片段。我使用一个单独为每个片段。
公共类FragWelcome扩展片段{私有静态FragWelcome _fs;OnClickListener mListener;公共FragWelcome(){}公共静态FragWelcome getFrag(){ 如果(FragWelcome._fs == NULL)_fs =新FragWelcome(); 返回_fs;}@覆盖公共无效的onCreate(捆绑savedInstanceState){ super.onCreate(savedInstanceState);}@覆盖公共无效onActivityCreated(捆绑savedInstanceState){ super.onActivityCreated(savedInstanceState);}@覆盖公共无效onAttach(活动活动){ super.onAttach(活动); 尝试{ mListener =(OnClickListener)活性; }赶上(抛出ClassCastException E){ 抛出新ClassCastException异常(activity.toString()+必须实现OnClickListener); }}公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){ 视图V = inflater.inflate(R.layout.frag_welcome,集装箱,FALSE); ((按钮)v.findViewById(R.id.btnCreateNewList))setOnClickListener(mListener)。 ((按钮)v.findViewById(R.id.btnEditOldList))setOnClickListener(mListener)。 返回伏;}}
然后我有我的碎片经理级与像这些方法:
公共无效addFragment(INT容器,片f,诠释淡入,淡出INT,布尔addtobackstack,字符串变量){ this._currentFragment = F; this._fragTrans = this._fragMan.beginTransaction(); this._fragTrans.setCustomAnimations(淡入,淡出); this._fragTrans.add(集装箱,F标签); 如果(addtobackstack)this._fragTrans.addToBackStack(标签); this._fragTrans.commit();}公共无效replaceFragment(INT容器,片f,诠释淡入,淡出INT,布尔addtobackstack,字符串变量){ this._currentFragment = F; this._fragTrans = this._fragMan.beginTransaction(); this._fragTrans.setCustomAnimations(淡入,淡出); this._fragTrans.replace(集装箱,F标签); 如果(addtobackstack)this._fragTrans.addToBackStack(标签); this._fragTrans.commit();}
这是我的主要活动课AC_Main的onCreate方法。
@覆盖公共无效的onCreate(捆绑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\");}
我能说什么....一切正常,只是优秀。没有错误可言......只要我不尝试启动APP第二次。
08-21 16:27:18.278:D / AndroidRuntime(21576):关闭VM08-21 16:27:18.278:W / dalvikvm(21576):主题ID = 1:螺纹未捕获的异常(组= 0x40c351f8)退出08-21 16:27:18.283:E / AndroidRuntime(21576):致命异常:主要08-21 16:27:18.283:E / AndroidRuntime(21576):了java.lang.RuntimeException:无法启动活动ComponentInfo {de.lochmann.einkaufsliste / de.lochmann.einkaufsliste.AC_Main}:J- java.lang.IllegalStateException:活动已被破坏08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread.access $ 600(ActivityThread.java:127)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1159)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.os.Handler.dispatchMessage(Handler.java:99)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.os.Looper.loop(Looper.java:137)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread.main(ActivityThread.java:4507)08-21 16:27:18.283:E / AndroidRuntime(21576):在java.lang.reflect.Method.invokeNative(本机方法)08-21 16:27:18.283:E / AndroidRuntime(21576):在java.lang.reflect.Method.invoke(Method.java:511)08-21 16:27:18.283:E / AndroidRuntime(21576):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:790)08-21 16:27:18.283:E / AndroidRuntime(21576):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)08-21 16:27:18.283:E / AndroidRuntime(21576):在dalvik.system.NativeStart.main(本机方法)08-21 16:27:18.283:E / AndroidRuntime(21576):java.lang.IllegalStateException:通过活动引起已被摧毁08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1280)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.BackStackRecord.commitInternal(BackStackRecord.java:541)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.BackStackRecord.commit(BackStackRecord.java:525)08-21 16:27:18.283:E / AndroidRuntime(21576):在de.lochmann.einkaufsliste.FragMan.addFragment(FragMan.java:41)08-21 16:27:18.283:E / AndroidRuntime(21576):在de.lochmann.einkaufsliste.AC_Main.onCreate(AC_Main.java:124)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.Activity.performCreate(Activity.java:4465)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)08-21 16:27:18.283:E / AndroidRuntime(21576):... 11个
所以,再一次,当我开始从Eclipse的应用程序一切正常,该应用程序是完全稳定,直到我preSS Android设备(三星Galaxy S2)的home键,我回到我的应用程序。当我尝试启动应用程序再次将其与所述错误崩溃。任务经理说,它不是在后台运行了。所以我的问题是什么......我做错了,任何人都有自己的任何想法或经验?非常感谢。
我刚刚发现如果我在第二次应用程序崩溃和我的设备告诉我,它停止了应用程序,我可以在第三次尝试再次正常运行应用程序。也许它仍然是一个背景的碎片造成麻烦......!
编辑,新LogCat中输出,我实现每一个生命周期的方法后,我召集所有超级方法。
08-21 17:17:09.043:I / dalvikvm(25725):打开JNI的应用程序错误的解决方法目标SDK版本10 ...08-21 17:17:09.108:I /活动(25725):所谓的onCreate08-21 17:17:09.108:I / FragWelcome(25725):onAttach叫08-21 17:17:09.108:I / FragWelcome(25725):所谓的onCreate08-21 17:17:09.123:D / dalvikvm(25725):GC_FOR_ALLOC释放86K,3%的自由8909K / 9091K,暂停13毫秒08-21 17:17:09.128:I / dalvikvm堆(25725):成长堆(frag的情况下),以11.061MB为2432016字节分配08-21 17:17:09.148:D / dalvikvm(25725):GC_CONCURRENT释放1K,免费3%11282K / 11527K,暂停1毫秒+ 1毫秒08-21 17:17:09.203:D / dalvikvm(25725):GC_FOR_ALLOC释放0K,3%的自由11283K / 11527K,暂停11毫秒08-21 17:17:09.208:I / dalvikvm堆(25725):成长堆(frag的情况下),以16.278MB为5472016字节分配08-21 17:17:09.228:D / dalvikvm(25725):GC_CONCURRENT释放0K,免费2%16626K / 16903K,暂停1毫秒+ 2ms的08-21 17:17:09.318:I / FragWelcome(25725):onCreateView叫08-21 17:17:09.318:I / FragWelcome(25725):onActivityCreated叫08-21 17:17:09.323:I /活动(25725):在onStart叫08-21 17:17:09.323:I / FragWelcome(25725):在onStart叫08-21 17:17:09.323:I /活动(25725):onResume叫08-21 17:17:09.323:I / FragWelcome(25725):onResume叫08-21 17:17:09.503:D /剪贴板(25725):隐藏剪贴板在对话框输入出发:由别人完成了...!08-21 17:17:21.258:I / FragWelcome(25725):所谓的onPause08-21 17:17:21.258:I /活动(25725):所谓的onPause08-21 17:17:21.438:D /剪贴板(25725):隐藏剪贴板在对话框输入出发:由别人完成了...!08-21 17:17:21.908:I / FragWelcome(25725):所谓的onStop08-21 17:17:21.908:I /活动(25725):所谓的onStop08-21 17:17:21.908:I / FragWelcome(25725):onDestroyView叫08-21 17:17:21.908:I / FragWelcome(25725):所谓的onDestroy08-21 17:17:21.913:I / FragWelcome(25725):onDetach叫08-21 17:17:21.913:I /活动(25725):所谓的onDestroy08-21 17:17:32.833:I /活动(25725):所谓的onCreate08-21 17:17:32.833:D / AndroidRuntime(25725):关闭VM08-21 17:17:32.833:W / dalvikvm(25725):主题ID = 1:螺纹未捕获的异常(组= 0x40c351f8)退出08-21 17:17:32.838:E / AndroidRuntime(25725):致命异常:主要08-21 17:17:32.838:E / AndroidRuntime(25725):了java.lang.RuntimeException:无法启动活动ComponentInfo {de.lochmann.einkaufsliste / de.lochmann.einkaufsliste.AC_Main}:java.lang.IllegalStateException:活动已被破坏08-21 17:17:32.838:E / AndroidRuntime(25725):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)08-21 17:17:32.838:E / AndroidRuntime(25725):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)08-21 17:17:32.838:E / AndroidRuntime(25725):在android.app.ActivityThread.access $ 600(ActivityThread.java:127)
我从以前的logcat读的是一些问题与backstackrecord.commit ...有人知道这事?
08-21 16:27:18.283:E / AndroidRuntime(21576):java.lang.IllegalStateException:通过活动引起已被摧毁08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1280)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.BackStackRecord.commitInternal(BackStackRecord.java:541)08-21 16:27:18.283:E / AndroidRuntime(21576):在android.app.BackStackRecord.commit(BackStackRecord.java:525)08-21 16:27:18.283:E / AndroidRuntime(21576):在de.lochmann.einkaufsliste.FragMan.addFragment(FragMan.java:41)08-21 16:27:18.283:E / AndroidRuntime(21576):在de.lochmann.einkaufsliste.AC_Main.onCreate(AC_Main.java:124)
解决方案
试试这个:
私人无效setFragmentToTop(字符串标签){ FragmentManager FM = getSupportFragmentManager(); FragmentTransaction英尺= fm.beginTransaction(); ft.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out); 片段片段= fm.findFragmentByTag(标签); 如果(片段== NULL){ 如果(tag.equals(FragmentOne.TAG)){ 片段= FragmentOne.newInstance(); } 否则如果(tag.equals(FragmentTwo.TAG)){ 片段= FragmentTwo.newInstance(); } } ft.replace(R.id.layoutContent,片段 标签); ft.commit(); }
I am currently porting an Iphone app to Android and as I had no clue of fragments I thought I gonna try it with them, so I created several classes (one for each view thats presented to the user, all extending baseclass Fragment) and the respective xml layouts. Code below for the fragment that's shown on launch. I use a singleton for every fragment.
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;
}
}
I then have my Fragment Manager Class with methods like those :
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();
}
This is the onCreate method of my main activity class AC_Main.
@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");
}
What can I say....everything works as expected, just excellent. No errors at all... as long as I don't try to START THE APP FOR A SECOND TIME.
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
So again, everything works fine when I start the app from Eclipse, the app is totally stable, until I press the home button of my Android device (Samsung Galaxy S2) and I get back to my apps. When I try to start the app again it crashes with said error. The task manager says it's not running in background anymore. So my question is...what am I doing wrong, anybody has any ideas or experiences of your own?? Thanks a lot.
I just found out if I have the app crash at the second time and my device tells me it stopped the app, I can run the app normally again at the third try. Maybe it is still in background an the fragments are causing trouble...!?
Edit, new LogCat Output after I implemented each and every lifecycle method and I called all super methods.
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)
What I read from the former logcat is some problem with the backstackrecord.commit ... anybody knows anything about this?
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)
解决方案
Try this:
private void setFragmentToTop(String tag) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
Fragment fragment = fm.findFragmentByTag(tag);
if (fragment == null) {
if (tag.equals(FragmentOne.TAG)) {
fragment = FragmentOne.newInstance();
}
else if (tag.equals(FragmentTwo.TAG)) {
fragment = FragmentTwo.newInstance();
}
}
ft.replace(R.id.layoutContent, fragment,
tag);
ft.commit();
}
上一篇:如何以编程方式指定图片(位图),以联系人?位图、联系人、方式、图片
下一篇:它甚至有可能修改的apk,通过添加额外的类.dex并重新包装改良的manifest.xml?有可能、apk、dex、manifest