8

この例に従ってアプリケーションを開発しています。layout-landフォルダーでheader.xmlの横向きレイアウトを定義しましたが、向きを横向きに変更すると、定義されたレイアウトが画面に表示されません。

理由を知っていますか?

ありがとう

更新しました :

アクティビティコード:

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

2 に答える 2

20

Android では、さまざまなバージョンのリソース ファイルを提供して、画面のサイズや解像度、デバイスの向きなど、特定のデバイス構成をサポートできます。Android がレイアウト ファイルをロードするとき、最初にres/layout-portフォルダー (縦向きの場合) またはres/layout-landフォルダー (横向きの場合) を調べます。ファイルが見つからない場合は、通常のres/layoutフォルダーを探します。

さらに、hereに記載されているように、実行時に特定のデバイス構成が変更されると (デバイスの向きなど)、アンドロイドは状態を保存して破棄し、保存された状態情報で開始することで、現在実行中のプロセスを再起動します。これにより、レイアウト ファイルを再度ロードできるようになり、ロードしようとすると、新しい向きのフォルダが検索されます。

したがって、アプリケーションを縦向きで起動すると、ファイルがres/layout-portまたはにロードされますres/layout。その後、デバイスを横向きに回転すると、プロセスが破棄されて再起動します。ただし、今回は横向きなので、res/layout-land代わりにレイアウト ファイルをチェックします。

ファイルをこのように設定しているが、思ったように動作しない場合は、最初に 2 つの異なるheader.xmlファイルをlayout-landlayout-portフォルダーに入れ、おそらく 1 つを赤い背景にして、正しいファイルを使用していないことを確認します。もう 1 つは背景が緑色です。ファイル参照を再確認し、Toast を使用してデバッグ情報を画面に投稿し、レイアウトが適切に膨張していることを確認してください。

デフォルトの動作は、Android が向きの変更を処理することです (これには、アクティビティを破棄し、すべてのレイアウト ファイルをリロードする新しいインスタンスを作成することが含まれます)。このデフォルトの動作は、マニフェスト ファイルのアクティビティ タグにプロパティ android:configChanges="orientation" が含まれていない限り、常に発生します。(このタグは向き以外の引数を取ることができます。Android は、このタグに引数として渡したものを除くすべてのイベントの構成変更を処理します。)

タグを含めるandroid:configChanges="orientation"と、デバイスの向きが変わったときにアクティビティを破棄せず、レイアウト ファイルをリロードしないように Android に指示します。デフォルトの動作の代わりに、(定義した) メソッドを呼び出して、向きの変更を Android に自動的に処理させるのではなく、自分で変更を処理できるようにします。これは、アクティビティを破棄することが大きな不便になる場合に、自動的に破棄する必要がないようにすることを目的としています。

編集:コメントの議論からいくつかのものを追加しました

于 2012-06-05T19:41:04.440 に答える
5

そのアクティビティのファイルで定義android:configChanges="orientation"し、そのメソッドmanifestをオーバーライドする必要がありますonConfigChanged()setContentView()

そのようです:

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

    super.onConfigurationChanged(newConfig);
}
于 2012-09-25T14:53:18.240 に答える