Надеюсь, это не глупый вопрос с ответом прямо под моим носом, потому что я проводил время в одиночестве, пытаясь по-разному исправить это, и это наконец, достаточно поздно, что я собираюсь отказаться от этого вопроса и, наконец, немного поспать.Добавлены вкладки, теперь сбой при изменении ориентации - Android w/ActionBarSherlock
Я создаю образец приложения, чтобы выработать изломы в пользовательском интерфейсе, чтобы впоследствии добавить его в реальное приложение. Приложению будут вкладки с listfragments, а при выборе списка он откроет новый фрагмент с текстом или рисунком.
Все работает чудесно в портрете, но я все время терплю неудачу, когда пытаюсь перейти к пейзажу с любой вкладки или фрагмента. Я обвиняю вкладки, смена ориентации работала отлично, когда это был только один список, затем я добавил вкладки, и эта ошибка начала появляться.
Способ отображения фрагментов заключается в замене фрагментов в xml, поскольку я сказал, что он отлично работает до появления вкладок. Переключатель ориентации подсказывает необходимость в ландшафтном xml, хотя, я думаю, проблема заключается в том, что вкладки не перезагружаются должным образом с новым макетом при изменении ориентации. Я все еще супер новый, поэтому я знаю, что использую onSaveInstanceState, но я не уверен, как правильно это сделать, или если решение отличается.
Приходит код.
Портрет XML
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_layout_support"
android:layout_width="match_parent"
android:layout_height="match_parent" >
***id.titles includes the listview, which needs to be replaced in portrait***
<fragment
android:id="@+id/titles"
android:layout_width="match_parent"
android:layout_height="match_parent"
class=".TitlesFragment" />
</FrameLayout>
Пейзаж XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:baselineAligned="false"
android:orientation="horizontal"
tools:context=".TitlesFragment" >
***listview on the left***
<fragment
android:id="@+id/titles"
android:name=".TitlesFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
***Details frame for fragments to inflate into on the right***
<FrameLayout
android:id="@+id/details"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3" />
</LinearLayout>
ListFragment Класс (оба списка похожи)
public class TitlesFragment extends SherlockListFragment implements ActionBar.TabListener {
boolean mDualPane;
int mCurCheckPosition = 0;
private Fragment mFragment;
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
setListAdapter (new ArrayAdapter<String> (getActivity(),
android.R.layout.simple_list_item_1, android.R.id.text1, ColorList.COLORS));
/* Checking if landscape or not. id.details is unique to landscape */
View detailsFrame = getActivity().findViewById(R.id.details);
mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;
if (savedInstanceState != null){
mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
}
if (mDualPane){
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
showDetails(mCurCheckPosition);
}
}
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);
/****** This SaveInstanceState did well at changing the orientation before the tabs were added.
* Is there a way to refresh the tabs on the new layout when the orientation changes? */
}
@Override
public void onListItemClick(ListView l, View v, int position, long id){
showDetails(position);
}
/* If Landscape, replace details. If not, replace titles, which includes the listview */
void showDetails(int position){
SherlockFragment newContent = new SherlockFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if(mDualPane){
switch(position){
case 0:
newContent = new Blue();
break;
case 1:
newContent = new Red();
break;
case 2:
newContent = new Green();
break;
case 3:
newContent = new Yellow();
break;
case 4:
newContent = new Purple();
break;
} ft.replace(R.id.details, newContent);
} else {
switch(position){
case 0:
newContent = new Blue();
break;
case 1:
newContent = new Red();
break;
case 2:
newContent = new Green();
break;
case 3:
newContent = new Yellow();
break;
case 4:
newContent = new Purple();
break;
}ft.replace(R.id.titles, newContent);
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
return;
}
/* Tab functionality */
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
mFragment = new TitlesFragment();
ft.replace(R.id.titles, mFragment);
//ft.attach(mFragment);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
//ft.remove(mFragment);
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
}
Спасибо за вашу помощь! Прошу прощения за то, что я уйду после публикации, но я вернусь после нескольких часов сна.