Skip to main content
 首页 » 编程设计

android之我可以开始多少级 Activity/fragment

2025年05月04日16soundcode

我从FragmentActivity / Fragment组合的第3层启动从画廊中挑选图像的 Activity 时遇到问题。如果我从第一级或第二级启动它,它将起作用。
在该应用程序中,最多可以运行5个级别的FramentActivity / Fragment组合,而不会出现问题,但是我不会开始从中选择图像的 Activity 。

我可以开始使用FramentActivity / Fragment组合的最高级别吗?还是我做错了什么?

FragmentActivity像这样启动Fragment:

public class MyActivity extends FragmentActivity 
{ 
private MyFragment _fragment; 
... 
 
@Override 
public void onCreate( Bundle savedInstanceState ) 
{ 
    super.onCreate( savedInstanceState ); 
    setContentView( R.layout.simple_fragment_container_activity ); 
 
    // create the fragment to show 
    FragmentManager fm = getSupportFragmentManager(); 
    _fragment = (MyFragment)fm.findFragmentById( R.id.fragment_container ); 
 
    // If the Fragment is non-null, then it is currently being retained across a configuration change. 
    if( _fragment == null ) 
    { 
        _fragment = new MyFragment(); 
 
        // start the new fragment 
        FragmentTransaction ft = fm.beginTransaction(); 
        ft.add( R.id.fragment_container, _fragment ); 
        ft.commit(); 
    } 
} 

片段代码为:
@Override 
public void onCreate( Bundle savedInstanceState ) 
{ 
    super.onCreate( savedInstanceState ); 
 
    // retain this fragment across configuration changes 
    setRetainInstance( true ); 
} 
@Override 
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) 
{ 
    View v = inflater.inflate( R.layout.my_fragment, container, false ); 
    ... 
    return v; 
} 

在按钮的OnClickListener中,我像这样启动图像选择器:
Intent intent = new Intent( Intent.ACTION_GET_CONTENT ); 
intent.setType( "image/*" ); 
startActivityForResult( intent, 20 );            

关闭图像选择器后(无论是否选择图像),我的应用都会崩溃,然后恢复。 onActivityResult方法有时被完全调用,有时被部分调用。它除了记录当前的图像路径外什么也没有做:
if( resultCode != Activity.RESULT_OK ) return; 
if( requestCode == 20 ) 
{ 
    Uri selectedImage = intent.getData(); 
    Log.w( null, "image picked: " + selectedImage.toString() ); 
} 

崩溃将其写入LogCat,并且在我的代码IMO中未发生:
05-19 08:18:19.210: D/AndroidRuntime(24592): Shutting down VM 
05-19 08:18:19.210: W/dalvikvm(24592): threadid=1: thread exiting with uncaught exception (group=0x41826da0) 
05-19 08:18:19.220: E/AndroidRuntime(24592): FATAL EXCEPTION: main 
05-19 08:18:19.220: E/AndroidRuntime(24592): Process: ch.infero.testapp, PID: 24592 
05-19 08:18:19.220: E/AndroidRuntime(24592): java.lang.RuntimeException: Unable to resume activity {ch.infero.testapp/ch.infero.testapp.settings.MyActivity}: android.database.StaleDataException: Attempted to access a cursor after it has been closed. 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2946) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2975) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.os.Handler.dispatchMessage(Handler.java:102) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.os.Looper.loop(Looper.java:157) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.app.ActivityThread.main(ActivityThread.java:5356) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at java.lang.reflect.Method.invokeNative(Native Method) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at java.lang.reflect.Method.invoke(Method.java:515) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at dalvik.system.NativeStart.main(Native Method) 
05-19 08:18:19.220: E/AndroidRuntime(24592): Caused by: android.database.StaleDataException: Attempted to access a cursor after it has been closed. 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:64) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.database.BulkCursorToCursorAdaptor.requery(BulkCursorToCursorAdaptor.java:133) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.database.CursorWrapper.requery(CursorWrapper.java:186) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.app.Activity.performRestart(Activity.java:5471) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.app.Activity.performResume(Activity.java:5497) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2936) 
05-19 08:18:19.220: E/AndroidRuntime(24592):    ... 10 more 

请您参考如下方法:

不,没有这样的明确限制。您遇到的问题是,尽管其中一个 Activity 之前已经关闭,但当其中一个 Activity 回到最前面时(似乎在MyActivity.onResume()中),数据库游标已被重用。