0

Надеюсь, это не глупый вопрос с ответом прямо под моим носом, потому что я проводил время в одиночестве, пытаясь по-разному исправить это, и это наконец, достаточно поздно, что я собираюсь отказаться от этого вопроса и, наконец, немного поспать.Добавлены вкладки, теперь сбой при изменении ориентации - 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 

} 
} 

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

ответ

0

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

Смежные вопросы