2012-04-05 14 views
6

Utworzono test project, który zawiera dwa różne fragmenty, które mają być wyświetlane w tym samym działaniu. Jeden fragment jest dla krajobrazu, a drugi dla portretu.Po zmianie orientacji nie został załadowany inny fragment (Android)

# My unique activity 
public class MainActivity extends FragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

# First Fragment 
public class LandscapeFragment extends Fragment { 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     TextView v = (TextView) inflater.inflate(R.layout.fragment, container, false); 
     v.setText("LANDSCAPE"); 
     return v; 
    } 
} 

# Other Fragment 
public class PortraitFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     TextView v = (TextView) inflater.inflate(R.layout.fragment, container, false); 
     v.setText("PORTRAIT"); 
     return v; 
    } 
} 

Mam dwa pliki main.xml, jeden w układzie/i drugi w układzie-land /. Każdy plik main.xml wskazuje właściwy Fragment, który ma być użyty.

<!-- layout-land/main.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment" 
    android:name="br.luckcheese.test.LandscapeFragment" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="5dp" /> 

<!-- layout/main.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment" 
    android:name="br.luckcheese.test.PortraitFragment" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="5dp" /> 

<!-- layout/fragment.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" /> 

Po uruchomieniu aplikacji w trybie krajobrazowym wyświetlana jest funkcja LandscapeFragment, a po otwarciu w pozycji Portrait pojawia się PortraitFragment. Jak na razie dobrze.

Ale jeśli otworzę krajobraz i obrócę urządzenie do portretu, wówczas funkcja LandscapeFragment zostanie ponownie załadowana i wyświetlona. Co nie jest przewidywanym zachowaniem. Powinien zostać załadowany PortraitFragment.

I to samo dzieje się na odwrót, jeśli urządzenie zaczyna się w orientacji portretowej, a następnie obracam je do krajobrazu: PortraitFragment po prostu zostaje przeładowany, zamiast załadowanego LandscapeFragment.

Co robię źle?

Odpowiedz

2

Upewnij się, że nie masz: android:config="orientation" w manifest.xml

+0

Nie, unikalna linia dodałem do domyślnej manifeście to "android: screenOrientation =" sensor "" dla aktywności – Luckcheese

+0

Czy próbujesz zrobić przerwę w onCreate() swojej aktywności, aby sprawdzić, czy ta metoda jest wywoływana podczas obracania urządzenia? –

+0

Tak. To się nazywa. Dodałem komunikaty logów onCreate dla mojej aktywności i dla każdego fragmentu. I kiedy obracam urządzenie, onCreate niewłaściwego fragmentu jest wywoływany po działaniu onCreate. – Luckcheese

1

Problem jest w twoich 2 układy, fragment identyfikatory są takie same. Wystarczy zmienić te fragment identyfikatorów, takich jak:

fragmentportrait dla układu/main.xml

fragmentlanscape na układ-land/main.xml. (I zmienić również: Fragment frag = getSupportFragmentManager() findFragmentById (R.id.fragment);

frag.setRetainInstance (false); .)

+0

Ok, ten pracownik. Ale nie zastanawiałem się, dlaczego trzeba dodawać różne identyfikatory? Ponieważ na moim kodzie muszę przetestować oba, aby ustawić frag.setRetainInstance (false). Ale, ja też dokonuję pracy tworząc unikalny układ z FrameLayout i dodając fragmenty po kodzie po przetestowaniu bieżącej orientacji przez getResource(). GetConfiguration(). – Luckcheese

Powiązane problemy