3

各会話に Fragment を使用するインスタント メッセージング アプリケーションを作成しています。ユーザーは横にスワイプして会話間を移動できます。

Stackoverflow で同様の質問を集中的に調べたにもかかわらず、ユーザーが会話を離れたときにフラグメントを削除する際にまだ問題があります。

たとえば、彼らが会話 (およびフラグメント) A、B、および C にいるとします。B が閉じられると、コードは画面をフラグメント A に変更します。それは問題ありませんが、右にスクロールして会話 C を取得すると、アプリがクラッシュします。以下で。

誰でも助けることができますか?Fragment の作成と削除のコードの関連部分を以下に示します。ありがとうございました。

クラッシュの詳細

>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 );
        }
}
4

1 に答える 1

0

次のコードを使用して、プログラムでフラグメントを削除できます

FragmentManager fm = getActivity().getSupportFragmentManager();
fm.popBackStack("NameofBackstack",
FragmentManager.POP_BACK_STACK_INCLUSIVE);
于 2014-05-23T09:56:00.523 に答える