Надежный способ обработки фрагмента при изменении ориентации
public class MainActivity extends Activity implements MainMenuFragment.OnMainMenuItemSelectedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
// add menu fragment
MainMenuFragment myFragment = new MainMenuFragment();
fragmentTransaction.add(R.id.menu_fragment, myFragment);
//add content
DetailPart1 content1= new DetailPart1 ();
fragmentTransaction.add(R.id.content_fragment, content1);
fragmentTransaction.commit();
}
public void onMainMenuSelected(String tag) {
//next menu is selected replace existing fragment
}
у меня есть необходимость отображать два вида списка бок о бок ,меню слева и его содержимое на правой стороне,по умолчанию первое меню выбрано и его содержимое отображается на правой стороне.Фрагмент, который отображает содержимое, как показано ниже
public class DetailPart1 extends Fragment {
ArrayList<HashMap<String, String>> myList = new ArrayList<HashMap<String, String>>();
ListAdapter adap;
ListView listview;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(savedInstanceState!=null){
myList = (ArrayList)savedInstanceState.getSerializable("MYLIST_obj");
adap = new LoadImageFromArrayListAdapter(getActivity(),myList );
listview.setAdapter(adap);
}else{
//get list and load in list view
getlistTask = new GetALLListTasks().execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.skyview_fragment, container,false);
return v;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("MYLIST_obj", myList );
}
}
onActivityCreated и onCreateView называется два раза есть много примеров там, используя фрагменты ,поэтому я новичок в этом сегменте я не могу соотнести пример с моей проблемой .Мне нужно доказательство дурака способ обработки изменения ориентации в лучшую сторону.Я не объявил android: configChanges в файле манифеста, мне нужно действие уничтожить и воссоздать, чтобы я мог использовать другой макет в ландшафтном режиме.Пожалуйста, помогите обходной путь
2 ответа:
вы создаете новый фрагмент каждый раз, когда вы поворачиваете экран в своей деятельности
onCreate();
но вы также поддерживаете старые сsuper.onCreate(savedInstanceState);
. Поэтому, возможно, установите тег и найдите фрагмент, если он существует, или передайте нулевой пакет super.это заняло у меня некоторое время, чтобы узнать, и это действительно может быть bi**** когда вы работаете с такими вещами, как viewpager.
Я бы рекомендовал вам прочитать о фрагментов дополнительное время как эта тема транслируется.
вот пример того, как обрабатывать фрагменты при регулярном изменении ориентации:
активность:
public class MainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) { TestFragment test = new TestFragment(); test.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit(); } else { TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag"); } } }
фрагмент:
public class TestFragment extends Fragment { public static final String KEY_ITEM = "unique_key"; public static final String KEY_INDEX = "index_key"; private String mTime; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_layout, container, false); if (savedInstanceState != null) { // Restore last state mTime = savedInstanceState.getString("time_key"); } else { mTime = "" + Calendar.getInstance().getTimeInMillis(); } TextView title = (TextView) view.findViewById(R.id.fragment_test); title.setText(mTime); return view; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("time_key", mTime); } }
хорошее руководство о том, как сохранить данные между изменениями ориентации и рекреационной деятельности можно найти в руководстве для Андроид.
резюме:
сделайте свой фрагмент сохран:
setRetainInstance(true);
создать новый фрагмент только при необходимости (или хотя бы взять из него данные)
dataFragment = (DataFragment) fm.findFragmentByTag("data"); // create the fragment and data the first time if (dataFragment == null) {