2012-06-05 49 views
8

我正在開發一個應用程序,根據this example。我在layout-land文件夾中爲header.xml定義了橫向佈局,但是當我將方向更改爲橫向時,定義的佈局未出現在屏幕中。layout-land中定義的xml佈局不會出現在android應用程序中

不知道爲什麼?

感謝

更新時間:

活動代碼:

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佈局在橫向模式下:

<?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

你可以發佈的XML和活動的代碼? – matt5784

+0

我是否理解正確的話,你必須在這兩個佈局端口和佈局,土地的文件夾佈局和佈局端口是表示縱向但佈局,土地不是橫向顯示? – matt5784

+0

不,我沒有陸地端口文件夾,我在佈局(默認文件夾)旁創建了layout-land來包含header.xml文件的橫向版本。我對嗎 ? –

回答

18

的Android允許你提供不同版本的資源文件支持具體的設備配置,包括屏幕尺寸/分辨率n和(正如你試圖做的那樣)設備方向。當android正在加載佈局文件時,它將首先在res/layout-port文件夾(如果是縱向)或res/layout-land文件夾(如果它處於橫向方向)中查找。如果沒有找到該文件,它會查找常規文件夾res/layout

此外,如注意到here,當運行時某些設備配置發生變化(如設備方向)時,android會通過保存狀態,銷燬狀態,然後使用保存的狀態信息啓動它,從而重新啓動當前正在運行的任何進程。這允許它再次加載佈局文件,並且當它試圖加載它時,它將把它看作新方向的文件夾。

因此,如果您以縱向方式啓動應用程序,它將加載文件res/layout-portres/layout。如果您然後將設備旋轉到風景,它將破壞您的過程並重新啓動。但是,這次它將處於橫向模式,因此它將檢查res/layout-land而不是佈局文件。

如果您在文件中設置了這種方式,但它不工作,你認爲它應該,我會先驗證它是絕對不會使用正確的文件,通過將兩個不同的header.xml文件在layout-landlayout-port文件夾,也許一個有紅色背景,一個有綠色背景。確保仔細檢查文件引用,並使用Toast在屏幕上發佈一些調試信息,以確保它正確地擴展布局。

默認行爲是android處理方向更改(這涉及銷燬您的活動並創建它的新實例,它將重新加載所有佈局文件)。除非您的清單文件中的活動標籤包含屬性android:configChanges =「orientation」,否則此默認行爲將始終發生。 (這個標籤可以採用除了方向以外的參數 - android會處理所有事件的配置變化,除了你作爲參數傳遞給這個標籤以外的所有事件。)

如果你包含android:configChanges="orientation"標籤,你告訴android不要銷燬你的活動而不是在設備的方向改變時重新加載佈局文件。它不會調用默認行爲,而是調用一個方法(您定義的方法),使您可以對自己進行的方向更改進行任何更改,而不是讓android自動處理方向更改。它的目的是,如果摧毀你的活動將是一個很大的不便,它不必自動銷燬。

編輯:增加了一些東西在徵求意見討論

+1

我創建了一個佈局端口的文件夾,並把header.xml文件存在,並作了一些修改的背景,使他們不同,但我剛剛開始在縱向(或橫向)模式應用它顯示的差異,當改變方向以風景(人像)它仍然是一樣的沒有分歧! –

+0

你是否也從'res/layout'文件夾中移除了header.xml文件? – matt5784

+0

yes在res/layout文件夾中沒有header.xml。 –

5

你應該在manifest文件該活動在setContentView()

定義android:configChanges="orientation",並重寫onConfigChanged()方法,像這樣:

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

    super.onConfigurationChanged(newConfig); 
} 
+0

這裏將創建視圖,但現有狀態將消失。這是對的嗎? – sandeepmaaram

+0

它工作的兄弟.... –