【发布时间】:2016-09-06 09:12:57
【问题描述】:
最近我正在开发我的应用程序,以使其加载更快并更好地工作,我在我的 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); 在我的片段类中它不起作用。
您建议什么解决方案来防止应用在每次选择菜单项时重新创建新片段?
【问题讨论】:
-
也许是加载问题?而不是片段本身?尝试实现一些预取并提前执行您的 LoadJson 任务。
-
嘿,请访问this link。希望在这里你能找到有用的东西。
-
我认为这没有任何区别,因为有一些计算可以制作 culester 标记并迭代 json 文件并将其放在地图上,这需要很长时间,并且每次应用程序制作新副本片段这些计算会发生它认为解决方案不能重新生成片段
-
这不是导航抽屉。这是另外一回事。导航抽屉可以通过从屏幕开始处(通常是左侧)做出滑动/滑动手势或按下汉堡按钮(在 ActionBar 中)来调出。它仅在 Activity 的
onCreate()生命周期方法期间创建/恢复。你所做的显然是另一回事。 -
@Sufian 它的作用完全相同,但我为每个菜单项定义了一个 ID,因此我在选择其中一个时实现我的片段
标签: android android-fragments navigation-drawer