Android 如何使用已创建的对象打开片段

Android 如何使用已创建的对象打开片段,android,android-fragments,Android,Android Fragments,在我的Android应用程序中,我使用的是导航抽屉,我打开抽屉项目点击的片段。我想每次都使用相同的对象,但找不到正确的方法。加载也需要一些时间(1-2秒),目前我没有使用任何api 以下是我迄今为止所做的工作: public class HomeActivity extends FragmentActivity { public String getTitleText() { return titleText; } public void setTitl

在我的Android应用程序中,我使用的是导航抽屉,我打开抽屉项目点击的片段。我想每次都使用相同的对象,但找不到正确的方法。加载也需要一些时间(1-2秒),目前我没有使用任何api

以下是我迄今为止所做的工作:

public class HomeActivity extends FragmentActivity {
    public String getTitleText() {
        return titleText;
    }

    public void setTitleText(String titleText) {
        this.titleText = titleText;
        titleTextTextView = (AvenirBookTextview) findViewById(R.id.home_title);
        titleTextTextView.setText(titleText);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        HomeMenuButtonLayout = (LinearLayout) findViewById(R.id.HomeMenuButtonLayout);
        HomeMenuButtonLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDrawerLayout.openDrawer(GravityCompat.START);
            }
        });
        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_item);
        navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_item_icon);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList<NavDrawerItem>();

        // adding nav drawer items to array
        for (int i = 0; i < navMenuTitles.length; i++) {
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[i], navMenuIcons.getResourceId(i, -1)));
        }

        // Set Header Right Drawer
        LayoutInflater inflaters = getLayoutInflater();
        ViewGroup headertop = (ViewGroup) inflaters.inflate(R.layout.list_home_header, mDrawerList,
                false);
        mDrawerList.addHeaderView(headertop, null, false);

        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems, "yes");
        mDrawerList.setAdapter(adapter);

        openFragment(new HomeFragment());
        setTitleText("Home");

        mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                if (position == 1) {
                    openFragment(new Fragment1());
                }

                if (position == 2) {
                    openFragment(new Fragment2());
                }

                if (position == 3) {
                    openFragment(new Fragment3());
                }

                if (position == 4) {
                    openFragment(new Fragment4());
                }
                if (position == 5) {
                    openFragment(new Fragment5());
                }

                if (position == 6) {
                    openFragment(new Fragment6());
                }

                if (position == 7) {
                    openFragment(new Fragment7());
                }
              }
        });
    }

    public void openFragment(final Fragment fragment) {
        // TODO Auto-generated method stub


                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).addToBackStack(null).commit();

      mDrawerLayout.closeDrawers();
    }
}
编辑

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.testApplication/com.testApplication.HomeActivity}: java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
at android.app.ActivityThread.access$800(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Caused by: java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:717)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1259)
at android.app.Activity.performStart(Activity.java:6026)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413) 
at android.app.ActivityThread.access$800(ActivityThread.java:155) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5343) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 
试试这个

    public void replaceFragment(Fragment fragment, boolean addToBackStack) {
    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction();

    if (addToBackStack) {
        transaction.addToBackStack(null);

    } else {
        getSupportFragmentManager().popBackStack(null,
                FragmentManager.POP_BACK_STACK_INCLUSIVE);

    }
    transaction.replace(R.id.frame_container, fragment);
    transaction.commit();
    getSupportFragmentManager().executePendingTransactions();
}
像这样使用

replaceFragment(new Fragment1(), false);

<> >而不是调用<代码>替换()/<代码>方法,考虑隐藏和显示所需的片段。
FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.show(getFragmentManager().findFragmentByTag(fragmentTagToBeShown));
    transaction.hide(getFragmentManager().findFragmentByTag(currentFragmentTag));
    transaction.commit();
当然,请确保在开始时以隐藏状态添加所有需要的片段:

Fragment myFragment = new MyFragemnt();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.add(R.id.fragmentContainer, myFragment, SOME_TAG);
    transaction.hide(myFragment);
    transaction.commit();

它不工作了,每次都在使用新对象,为什么要使用相同的对象,而旧的片段在UI中不可见?我怀疑这不是一个好的设计?因为我不想每次单击菜单时都加载数据。我只想加载一次数据并重用它在活动中存储数据,当调用replaceFragment()时,将数据设置为片段对象。只要活动持续,您的数据就会持续。它会给出异常:java.lang.NullPointerException:尝试写入空对象引用上的字段“int android.support.v4.app.Fragment.mNextAnim”。如果getSupportFragmentManager().findFragmentByTag()==null,则会出现此错误,确保添加了带有正确标记的片段;FragmentTransaction=getSupportFragmentManager().beginTransaction();添加(R.id.frame_容器,myHomeFragment,“HOME”);commit();FragmentTransactionHome=getSupportFragmentManager().beginTransaction();show(getSupportFragmentManager().findFragmentByTag(“主页”);transactionHome.commit();我做得对吗?@Abhay,是的,但是
getSupportFragmentManager().beginTransaction();show(getSupportFragmentManager().findFragmentByTag(“主页”);transactionHome.commit()应该在openFragment方法内部调用。而添加fragemnt的事务应该在
onCreate
中。你能显示完整的错误跟踪吗?是的,它工作了,谢谢你的指导
Fragment myFragment = new MyFragemnt();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.add(R.id.fragmentContainer, myFragment, SOME_TAG);
    transaction.hide(myFragment);
    transaction.commit();