我从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()中),数据库游标已被重用。
关于android - 我可以开始多少级 Activity/fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30318205/