В последнее время я работаю над своим приложением, чтобы оно загружалось быстрее и работало лучше, я использую панель навигации в моем 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);
в моем классе фрагментов это не сработает.
Какое решение вы предлагаете, чтобы приложение не создавало новый фрагмент каждый раз, когда мы выбираем пункт меню?
3 ответа
Вам нужно будет сохранить SparseArray<Fragment>
для хранения экземпляров в памяти.
Следуй этим шагам:
создайте поле в своей деятельности:
SparseArray<Fragment> myFragments;
инициализировать его в
onCreate()
, например:myFragments = new SparseArray<Fragment>();
обновите свой
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. }
- переместите объект
AsyncTask
в методonActivityCreated()
вашегоMainFragment
или аналогичный метод жизненного цикла.
Переместите объект MainFragment
в метод {{X2}} вашего {{X1}} или аналогичный метод жизненного цикла.…
Вы можете добавить 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();
Объявите их глобально
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;
}
Похожие вопросы
Связанные вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.