Добавлены вкладки, теперь происходит сбой при изменении ориентации - Android с ActionBarSherlock

Надеюсь, это не глупый вопрос с ответом прямо у меня под носом, потому что я потратил ооооочень много времени, пытаясь исправить это, и, наконец, уже достаточно поздно, чтобы я бросил этот вопрос и, наконец, поймал спать.

Я создаю пример приложения для устранения недостатков в пользовательском интерфейсе, чтобы позже добавить его в реальное приложение. В приложении будут вкладки с фрагментами списка, а при выборе списка будет открываться новый фрагмент с текстом или картинкой.

Все прекрасно работает в портретной ориентации, но у меня постоянно происходит сбой, когда я пытаюсь перейти в альбомную ориентацию с любой вкладки или фрагмента. Я виню вкладки, смена ориентации отлично работала, когда это был всего один список, затем я добавил вкладки, и эта ошибка начала появляться.

То, как я показываю фрагменты, заключается в замене фрагментов в 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

}
}

Спасибо за вашу помощь всем! Прошу прощения за то, что вынужден уйти после того, как опубликую это, но я вернусь после нескольких часов сна.


person RyWalk    schedule 17.09.2013    source источник


Ответы (1)


У меня было слишком много проблем с этим в последние несколько дней, поэтому я отказываюсь от интерфейса вкладок и пытаюсь создать макет ящика.

person RyWalk    schedule 17.09.2013