В последнее время я работаю над своим приложением, чтобы оно загружалось быстрее и работало лучше, я использую панель навигации в моем MainActivity:

    @Override
public boolean onNavigationItemSelected(MenuItem item) {

    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_camara) {
        LoadJson asyncTask = (LoadJson) new LoadJson(new LoadJson.AsyncResponse() {
            @Override
            public void processFinish(JSONArray output) {
                //Here you will receive the result fired from async class
                //of onPostExecute(result) method.
                //Set the fragment initially
                MainFragment fragment = new MainFragment(output);
                FragmentTransaction fragmentTransaction =
                        getSupportFragmentManager().beginTransaction();
                fragmentTransaction.add(R.id.fragment_container, fragment);
                fragmentTransaction.commit();
                // Handle the camera action
            }
        }).execute();


    } else if (id == R.id.nav_gallery) {
        //Set the fragment initially
        GalleryFragment fragment = new GalleryFragment();
        FragmentTransaction fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();


    } else if (id == R.id.nav_search) {
        //Set the fragment initially
        FetchResualt fragment = new FetchResualt();
        FragmentTransaction fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
        // Handle the camera action

    } else if (id == R.id.nav_manage) {//
         Bundle bundle = new Bundle();//
        bundle.putInt("someStr",ID_OF_BEACH);//
        //Set the fragment initially//
        FragmentBeach fragment = new FragmentBeach();//
        fragment.setArguments(bundle);//
        FragmentTransaction fragmentTransaction =//
                getSupportFragmentManager().beginTransaction();//
        fragmentTransaction.replace(R.id.fragment_container, fragment);//
        fragmentTransaction.commit();//
        // Handle the camera action

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

Как вы можете видеть, если мы нажмем первое меню if (id == R.id.nav_camara), оно передаст JSONArray классу Fragment, и загрузка займет около 4-5 секунд. Таким образом, если пользователь перемещается между меню каждый раз, когда он переходит к nav_camara, приложение останавливается на 4 секунды для загрузки, и, как вы можете видеть каждый раз, когда мы выбираем пункт меню, оно воссоздает новую копию фрагмента, поэтому даже если Я делаю: setRetainInstance(true); в моем классе фрагментов это не сработает.

Какое решение вы предлагаете, чтобы приложение не создавало новый фрагмент каждый раз, когда мы выбираем пункт меню?

0
Blacksword 6 Сен 2016 в 12:12

3 ответа

Лучший ответ

Вам нужно будет сохранить SparseArray<Fragment> для хранения экземпляров в памяти.

Следуй этим шагам:

  1. создайте поле в своей деятельности:

    SparseArray<Fragment> myFragments;
    
  2. инициализировать его в onCreate(), например:

    myFragments = new SparseArray<Fragment>();
    
  3. обновите свой onNavigationItemSelected():

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
    
        if (id == R.id.nav_camara) {
            // get cached instance of the fragment
            fragment = myFragments.get(INT_CONSTANT_FOR_CAM_FRAGMENT);
    
            // if fragment doesn't exist in myFragments, create one and add to it
            if (fragment == null) {
                fragment = new MainFragment();
                myFragments.put(INT_CONSTANT_FOR_CAM_FRAGMENT, fragment);
            }
    
            // now load the fragment
            FragmentTransaction fragmentTransaction =
                        getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();
    
        }
        // do the rest with others as well.
    }
    
  4. переместите объект AsyncTask в метод onActivityCreated() вашего MainFragment или аналогичный метод жизненного цикла.

Переместите объект MainFragment в метод {{X2}} вашего {{X1}} или аналогичный метод жизненного цикла.…

2
Sufian 7 Сен 2016 в 13:51

Вы можете добавить TAG, вставляя новый фрагмент в контейнер. Затем используйте FragmentManager#findFragmentByTag, чтобы найти любой фрагмент, ранее добавленный с тем же тегом.

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        Fragment oldFragment = manager.findFragmentByTag(tag);
        if (oldFragment != null)
            transaction.replace(R.id.fragment_container, oldFragment, tag);
        else
            transaction.replace(R.id.fragment_container, newInstanceOfFragment, tag);
        transaction.commit();
0
Alex Chengalan 6 Сен 2016 в 09:24

Объявите их глобально

GalleryFragment galleryFrag = new GalleryFragment();
FragmentTransaction ft;
FragmentManager fm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    fm = getSupportFragmentManager();

    ...
}

Затем по вашему выбору навигации

@Override
public boolean onNavigationItemSelected(MenuItem item) {

// Handle navigation view item clicks here.
int id = item.getItemId();

if (id == R.id.nav_search) {
    ft = fm.beginTransaction();
    ft.replace(R.id.fragment_container, galleryFrag).commit();
} 

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
0
Android.K.Doe 6 Сен 2016 в 09:58