2016-03-31 5 views
0

В моем приложении Android я использую навигационный ящик, и я открываю фрагменты на элементе элемента drawer. Я хочу использовать один и тот же объект каждый раз, но не смог найти правильный способ сделайте это. И это также занимает некоторое время (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(); 
    } 
} 

И я также пытался:

 public void openFragment(final Fragment fragment) { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        if (fragment.isAdded()) { 
         transaction.show(fragment); 
        } else { 
         transaction.replace(R.id.frame_container, fragment); 
         transaction.addToBackStack(fragment.getClass().getName()); 
         System.out.println("Number of Backstacks" + fragment.getClass().getName()); 
        } 

        transaction.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) 
+0

Почему вы хотите использовать один и тот же объект, когда старший фрагмент не виден в UI? Я сомневаюсь, что это не хороший дизайн? –

+0

Потому что я не хочу загружать данные каждый раз, когда нажимаю на меню. Я хочу загрузить данные только один раз и повторно использовать его. – AbhayBohra

+0

Храните данные в своей деятельности, а при вызове replaceFragment() установите данные в объект фрагмента. Ваши данные будут сохраняться до тех пор, пока ваша активность не будет сохранена. –

ответ

0

Вместо вызова replace() метод считают скрытие и показ нужный фрагмент.

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(); 
+0

Он дает исключение: java.lang.NullPointerException: пытается написать в поле 'int android.support.v4.app.Fragment.mNextAnim' на ссылку нулевого объекта – AbhayBohra

+0

Это ошибка появляется, если getSupportFragmentManager(). findFragmentByTag() == null, убедитесь, что вы добавили свои фрагменты с правильными тегами. – satorikomeiji

+0

Фрагмент myHomeFragment = new HomeFragment(); FragmentTransaction transaction = getSupportFragmentManager(). BeginTransaction(); transaction.add (R.id.frame_container, myHomeFragment, "HOME"); transaction.commit(); \t \t FragmentTransaction transactionHome = getSupportFragmentManager(). BeginTransaction(); transactionHome.show (getSupportFragmentManager(). FindFragmentByTag ("HOME")); transactionHome.commit(); \t \t \t \t ** Могу ли я делать это правильно ** – AbhayBohra

0

Try This

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); 
+0

Он не работает, он все еще использует новый объект каждый раз – AbhayBohra

Смежные вопросы