2012-06-05 11 views
8

Zajmuję się tworzeniem aplikacji zgodnie z this example. Zdefiniowałem układ poziomy pliku header.xml w folderze layout-land, ale kiedy zmienię orientację na landscape, zdefiniowany układ nie pojawi się na ekranie.zdefiniowany układ xml w układzie-ziemia nie pojawia się w aplikacji Android

Czy wiesz dlaczego?

Dzięki

aktualizacja:

Kod

aktywny:

public class ACENewsFeedActivity extends ListActivity { 

    // Progress Dialog 
    private ProgressDialog pDialog; 

    // Array list for list view 
    ArrayList<HashMap<String, String>> rssItemList = new ArrayList<HashMap<String,String>>(); 

    RSSParser rssParser = new RSSParser(); 

    List<RSSItem> rssItems = new ArrayList<RSSItem>(); 

    RssFeed rssFeed; 

    private static String TAG_TITLE = "title"; 
    private static String TAG_LINK = "link"; 
    private static String TAG_DESRIPTION = "description"; 
    private static String TAG_PUB_DATE = "pubDate"; 
    //private static String TAG_GUID = "guid"; // not used 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.rss_item_list); 

     /** 
     * Calling a backgroung thread will loads recent articles of a website 
     * @param rss url of website 
     * */ 
     new loadRSSFeedItems().execute(); 
     } 

     .... 
} 

XML Układ w trybie poziomym:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/layoutHeader" 
    android:layout_width="fill_parent" 
    android:layout_height="50dip" 
    android:layout_alignParentTop="true" 
    android:background="@layout/header_gradient" 
    android:orientation="horizontal"> 

    <!-- Logo --> 

    <!-- Refresh --> 


    <!-- Plus Button --> 

    <ImageButton 
     android:id="@+id/btnAddSite" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="5dip" 
     android:background="@null" 
     android:src="@drawable/plus" 
     android:layout_centerVertical="true" /> 

    <ImageView 
     android:id="@+id/logo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:src="@drawable/logo" /> 

    <ImageView 
     android:id="@+id/refreshList" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:src="@drawable/refresh" /> 

</RelativeLayout> 
+0

Czy możesz opublikować kod dla xml i działania? – matt5784

+0

Czy rozumiem poprawnie, że masz układy zarówno w folderach układu, jak i folderach układowych, a port układu jest wyświetlany w orientacji pionowej, ale obszar układu nie jest wyświetlany w orientacji poziomej? – matt5784

+0

Nie Nie mam folderu z portem lądowym, utworzyłem układ-ziemię obok układu (domyślny folder), aby zawierał wersję poziomą pliku header.xml. Czy mam rację ? –

Odpowiedz

18

Android pozwala zapewnić różne wersje plików zasobów do wspierania określone konfiguracje urządzeń, w tym rozmiar ekranu/rozdzielczość n i (jak próbujesz to zrobić) orientację urządzenia. Gdy Android ładuje plik układu, najpierw będzie wyglądał w folderze res/layout-port (jeśli jest ustawiony w orientacji pionowej) lub w folderze res/layout-land (jeśli jest ustawiony poziomo). Jeśli nie znajdzie pliku, będzie wyglądał w zwykłym folderze res/layout. Dodatkowo, jak zauważono, , gdy niektóre konfiguracje urządzenia ulegną zmianie (np. Orientacja urządzenia) podczas uruchamiania, Android uruchomi ponownie dowolny aktualnie uruchomiony proces, zapisując stan, niszcząc go, a następnie uruchamiając go z zapisanymi informacjami o stanie. Dzięki temu może ponownie załadować pliki layoutu i będzie wyglądał jak folder dla nowej orientacji, gdy spróbuje je załadować.

Po uruchomieniu aplikacji w pozycji pionowej plik zostanie załadowany w postaci res/layout-port lub res/layout. Jeśli następnie obrócisz urządzenie do krajobrazu, zniszczysz proces i uruchomisz ponownie. Jednak tym razem będzie w krajobrazie, więc sprawdzi pliki res/layout-land.

Jeśli pliki skonfigurować w ten sposób, ale to nie działa jak należy myśleć, bym najpierw sprawdzić, czy jest on na pewno nie za pomocą odpowiednich plików poprzez umieszczenie dwóch różnych header.xml pliki w folderach layout-land i layout-port , może jeden z czerwonym tłem i jeden z zielonym tłem. Upewnij się, że zweryfikujesz odniesienia do plików i może wykorzystasz Toast do umieszczenia na ekranie informacji o debugowaniu, aby upewnić się, że poprawnie nadpisuje układy.

Domyślnym zachowaniem Androida jest zmiana orientacji (która polega na zniszczeniu aktywności i utworzeniu nowej instancji, która przeładuje wszystkie pliki układu). To zachowanie domyślne zawsze będzie występować, chyba że tag aktywności w pliku manifestu zawiera właściwość android: configChanges = "orientation". (Ten znacznik może przyjmować argumenty inne niż orientacja - Android zajmie się zmianami konfiguracji dla wszystkich zdarzeń, z wyjątkiem tych, które przekazujesz jako argumenty do tego znacznika.)

Jeśli umieścisz tag android:configChanges="orientation", mówisz androidowi, że NIE zniszczysz swojej aktywności i NIE, aby ponownie załadować pliki układu, gdy zmieni się orientacja urządzenia. Zamiast domyślnego zachowania wywoła on metodę (którą definiujesz), aby umożliwić ci wprowadzanie zmian, które chcesz wprowadzić, aby obsłużyć zmianę orientacji, zamiast pozwalać androidowi na automatyczne jej obsługiwanie. Ma to na celu, aby zniszczenie Twojej działalności było poważną niedogodnością, która nie musi być automatycznie niszczona.

EDIT: dodano kilka rzeczy z komentarzem dyskusji

+1

Utworzono folder layout-port i umieściłem tam plik header.xml, a także wprowadziłem pewne zmiany w tle, aby były inne, ale właśnie wtedy, gdy uruchamiam aplikację w trybie portretu (lub krajobrazu), pokazuje ona różnicę i kiedy zmienia orientację do pejzażu (portret) pozostaje tak samo bez różnic! –

+0

czy usunąłeś również plik header.xml z folderu 'res/layout'? – matt5784

+0

Tak, nie ma pliku header.xml w folderze res/layout. –

5

powinno Ci określić android:configChanges="orientation" w pliku manifest dla tej działalności i zastąpić metodę onConfigChanged() w tym setContentView()

tak:

@Override  
public void onConfigurationChanged(Configuration newConfig) { 
    setContentView(R.layout.your_xml); 

    super.onConfigurationChanged(newConfig); 
} 
+0

Zostanie utworzony widok, ale istniejący stan zniknie. Czy to jest poprawne? – sandeepmaaram

+0

to zadziałało ... –

Powiązane problemy