永久删除Android片段

时间:2013-09-11 06:52:52

标签: java android android-layout android-fragments

我正在编写一个即时消息应用程序,它为每个对话使用片段,用户可以横向滑动以在对话之间移动。

尽管在Stackoverflow上仔细查看了类似的问题,但在用户离开会话时我仍然无法删除片段。

例如,假设他们正在谈话(和片段)A,B和C.当B关闭时,代码会将屏幕更改为片段A.这很好,但是当他们然后向右滚动以获得对话C时,该应用程序崩溃与以下。

有人可以帮忙吗?片段创建和删除代码的相关部分如下所示。谢谢。

崩溃详情

>D/AndroidRuntime( 9677): Shutting down VM
W/dalvikvm( 9677): threadid=1: thread exiting with uncaught exception (group=0x41039300)
>E/AndroidRuntime( 9677): FATAL EXCEPTION: main
>E/AndroidRuntime( 9677): java.lang.NullPointerException
>E/AndroidRuntime( 9677):   at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:819)
>E/AndroidRuntime( 9677):   at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130)
>E/AndroidRuntime( 9677):   at android.support.v4.view.ViewPager.populate(ViewPager.java:1066)
>E/AndroidRuntime( 9677):   at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
>E/AndroidRuntime( 9677):   at android.support.v4.view.ViewPager$3.run(ViewPager.java:244)
>E/AndroidRuntime( 9677):   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
>E/AndroidRuntime( 9677):   at android.view.Choreographer.doCallbacks(Choreographer.java:555)
>E/AndroidRuntime( 9677):   at android.view.Choreographer.doFrame(Choreographer.java:524)
>E/AndroidRuntime( 9677):   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
>E/AndroidRuntime( 9677):   at android.os.Handler.handleCallback(Handler.java:615)
>E/AndroidRuntime( 9677):   at android.os.Handler.dispatchMessage(Handler.java:92)
>E/AndroidRuntime( 9677):   at android.os.Looper.loop(Looper.java:137)
>E/AndroidRuntime( 9677):   at android.app.ActivityThread.main(ActivityThread.java:4898)
>E/AndroidRuntime( 9677):   at java.lang.reflect.Method.invokeNative(Native Method)
>E/AndroidRuntime( 9677):   at java.lang.reflect.Method.invoke(Method.java:511)
>E/AndroidRuntime( 9677):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
>E/AndroidRuntime( 9677):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
>E/AndroidRuntime( 9677):   at dalvik.system.NativeStart.main(Native Method)

相关代码:

public class ChatActivity extends FragmentActivity
{
.... unrelated code...
private FragmentManager manager = getSupportFragmentManager();
private ConversationsAdapter adapter = new ConversationsAdapter( manager );
.... unrelated code...

class ConversationsAdapter extends FragmentPagerAdapter
{
        private List<Fragment> fragments;

        public ConversationsAdapter( FragmentManager manager ) {
                super( manager );
                fragments = new ArrayList<Fragment>();
        }

        public void addItem()
        {
                Fragment item = new ConversationFragment();
                fragments.add( item );
                adapter.notifyDataSetChanged();
        }

        public void removeItem( int position ) {
                Fragment item = adapter.getItem( position );

                FragmentTransaction transaction = manager.beginTransaction();
                transaction.setTransition( FragmentTransaction.TRANSIT_FRAGMENT_FADE );
                transaction.remove( item );
                transaction.commit();

                fragments.remove( position );
                adapter.notifyDataSetChanged();

                ViewPager pager = (ViewPager) findViewById( R.id.viewpager );
                pager.setCurrentItem( position - 1 );
        }
}

1 个答案:

答案 0 :(得分:0)

你可以使用以下代码以编程方式删除片段

FragmentManager fm = getActivity().getSupportFragmentManager();
fm.popBackStack("NameofBackstack",
FragmentManager.POP_BACK_STACK_INCLUSIVE);