Android Fragment:怎么保存实例

原学程将引见Android Fragment:若何保留虚例的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

Android Fragment:怎么保存实例 教程 第1张

成绩描写

嗨,我有1个片断,它减载天图片断并从办事器夺取分歧的数据。我想保留片断的状况/虚例,而没有损坏以及调换它。我确切晓得onSaveInstanceState(Bundle OutState),但是我没有晓得怎样在我的例子中运用它(我也读到过碎片周期)。以下是单打菜单项时交流(应用调换)每一个片断的运动的代码:

public class Menu extends Activity {
 private void displayView(int position) {
// update the main content by replacing fragments

switch (position) {
case 0:
 fragment = new HomeFragment();
 break;
case 一:

 // map is here !!
 fragment = new TestMap();
 break;
case 二:
 fragment = new PhotosFragment();
 break;
case 三:
 fragment = new Co妹妹unityFragment();
 break;
case 四:
 fragment = new PagesFragment();
 break;
case 五:
 fragment = new WhatsHotFragment();
 DatabaseHandler db = new DatabaseHandler(getApplicationContext());
 db.resetTables();
 Intent i = new Intent(getApplicationContext(), Login.class);
 //Intent i = new Intent(getApplicationContext(), MainActivity.class);
 startActivity(i);

 // closing this screen
 finish();
 break;

default:
 break;
}



if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
  fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).co妹妹it();


  // update selected item and title, then close the drawer
  mDrawerList.setItemChecked(position, true);
  mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayo

ut.closeDrawer(mDrawerList);
 } 
 ...
 }

以下是映照的片断:

public class TestMap extends Fargment{
....
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
context = getActivity();
if(inst != null) {
 // Remove the view from the parent
 ((ViewGroup)inst.getParent()).removeView(inst);
 // Return it
 return inst;
}
else{
final View myFragmentView = inflater.inflate(R.layout.activity_main, container, false);

try {
 // Loading map and retrives locations from server 
 initilizeMap();

} catch (Exception e) {
 Log.e("ERROR", "ERROR IN CODE: " + e.toString());
 e.printStackTrace();
}
inst = myFragmentView;
return myFragmentView;
}
  }

...


public void onDestroyView() 
  {
 super.onDestroyView(); 
 Fragment fragment = (getFragmentManager().findFragmentById(R.id.map)); FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
 ft.remove(fragment);
 ft.co妹妹it();
  }
...
}

是以,有谁晓得怎样保留1开端曾经运转的Keep a片断,而没有是每一次我变动片断时老是调换以及烧毁它?提早感谢您。

推举谜底

与决于您要怎样处置数据以及片断:

    能否要应用之前的数据重修碎片?

    能否要将该虚例保存在内存中偏重新翻开它?

关于第1种情形,我修议您应用更耐久的数据保存,并将数据保留在片断的onStop中。而后,您不妨签进onCreateView以检查数据能否存留,假如存留,则减载回数据。您不妨很轻易天应用SharPref去完成这项任务,而且只需三言代码便可读与以及写进。假如数据只是地位以及1些字符串,我会修议如许做。您不妨经由过程对于保存数据应用时光戳去退1步扩大它,假如它太长,您不妨疏忽之前的数据偏重新减载,这对于地位数据颇有用。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
 super.onCreateView(inflater, container, savedInstanceState);
 ...

 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
 String previousData = prefs.getString("locationData"), null);
 if(previousData != null)
 {
 //Do something with data.
 }
 else {
 try {
 // Loading map and retrives locations from server 
 initilizeMap();
 } catch (Exception e) {
 Log.e("ERROR", "ERROR IN CODE: " + e.toString());
 e.printStackTrace();
 }
 }
}
@Override
public void onStop()
{
 Log.i(TAG, "onStop");
 super.onStop();
 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
 SharedPreferences.Editor editor = prefs.edit();
 editor.putString("locationData"), [your data]);
}

应用onSaveInstanceState保留数据是针对于设置装备摆设变动,而没有是针对于正在烧毁的片断(应用工作调换)。http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

关于第两种情形,您只需在片断上应用show以及Hide,如许它便没有会被烧毁,但是随后您必需修正结构以具有多个容器。http://developer.android.com/reference/android/app/FragmentTransaction.html
除非您的运动安排为同时显示多个片断,不然我没有修议应用此办法。

佳了闭于Android Fragment:怎样保留虚例的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。