2011-06-24 16 views
0

我試圖根據設備的屏幕大小動態選擇視圖。對於大多數設備我想要一個列表視圖,但對於xlarge屏幕大小,我想要一個網格視圖。我如何動態地分配使用android的視圖?

我已經在兩個獨立的library_list.xml文件中創建了佈局,一個在佈局文件夾中,另一個在layout-xlarge文件夾中。

列表視圖看起來像:

ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/library_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:visibility="gone" android:textColor="@android:color/black" android:background="@android:color/transparent" android:cacheColorHint="#00000000"

和網格視圖的樣子:

GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/library_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:columnWidth="@dimen/library_column_width" android:numColumns="auto_fit" android:verticalSpacing="10dp" android:horizontalSpacing="@dimen/library_item_horizontal_spacing" android:stretchMode="columnWidth" android:textColor="@android:color/black" android:background="@android:color/transparent" android:cacheColorHint="#00000000"

我的問題是,在我的Java代碼,我需要聲明一個公共變量持有該視圖,然後動態分配它。

我想聲明的AbsListView(我不能宣佈的GridView或ListView,因爲我不知道它是哪一個,直到運行時)是這樣的:

public static AbsListView libraryList;

...

libraryList = findViewById(R.id.library_list);

其上的華碩Eee變壓器廠平板電腦,但不是三星Galaxy或HTC的願望(它只是崩潰,登錄貓不告訴我任何東西)。是宣佈一個AbsListView正確的方式來做到這一點,或者我錯過了什麼?

我已閱讀http://developer.android.com/guide/practices/screens_support.html但這似乎沒有幫助我的問題。這似乎應該是一個相當普遍的情況,但我無法在任何地方找到答案。

謝謝!

+0

你爲什麼要聲明libraryList爲'static'?那可能是你的問題。例如,參見http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html。 –

+0

好的,我會研究一下,謝謝。至於在Java中使用視圖是定義一個AbsListView,當你不知道什麼類型的視圖時,你會使用正確的方式做到這一點? – odiggity

+0

因爲GridView和ListView都是從AbsListView派生的,所以它應該沒有'static'。如果沒有,除了如何定義'libraryList'這個問題。 –

回答

0

顯然,舊版本上absListView使用setAdapter的Android拋出的NoSuchMethodError,所以解決的辦法是先投它就像這樣:

if (libraryView instanceof ListView){ ((ListView)libraryView).setAdapter(listadapter); }

else if (libraryView instanceof GridView){ ((ListView)libraryView).setAdapter(listadapter); }

在這裏找到了答案:http://comments.gmane.org/gmane.comp.handhelds.android.devel/150653

感謝大家的幫助!

0

所以基本上你只想知道屏幕大小是什麼,所以在運行時你可以做出一個程序化的決定?一種選擇是創建一個包含單個字符串資源的xml文件...使用不同的值創建此文件的多個值(在values-hdpi,values-ldpi等中),但具有相同的ID。然後只需通過其ID來讀取字符串以確定屏幕大小。

+0

感謝您的回覆,但那不是我想要的。 根據屏幕大小,將選擇不同的佈局和視圖,網格視圖或列表視圖都具有相同的ID。我希望能夠以編程方式操作該視圖,但問題是我無法將其分配給變量,因爲我不知道它會是什麼類型的視圖。 – odiggity

+1

@odiggity - 設置內容後,您可以查看v = findViewById(id);'將視圖作爲基類,然後使用instanceof運算符決定如何處理它。例如,'if(v instanceof ListView){do_listview_setup();}' – mah

+0

那更接近但仍然不是我想要的。在獲得視圖後,我基本上只想'v.setAdapter()'和'setOnItemClickListener()',而不管是否返回GridView或ListView。因此,根據返回的視圖,不需要執行特定的功能。但問題是我不能只做'View v = findViewById(id); v.setOnItemClickListener()',因爲沒有爲View定義setOnItemClickListener()。 – odiggity

0

使用(如果您的佈局文件名爲screen.xml):

setContentView(R.layout.screen); 
AbsListView lv = (AbsListView)findViewById(R.id.library_list); 
lv.setAdapter(adapter); 
lv.setOnItemClickListener(listener); 

應該在你的onCreate方法工作:它可能似乎是顯而易見的,但要確保你findViewById之前要調用setContentView

如果因爲分配而發生崩潰,那麼您將在logcat中看到一些內容:如果它繼續失敗,我會建議仔細查看。我會冒險猜測,並說這不是導致崩潰的原因:顯示你的onCreate更完整的一大塊,我們可能會把它搞砸。

+0

謝謝費米。我對Android開發非常陌生,我或多或少只是想通過聲明一個AbsListView來確保我以正確的方式進行。 – odiggity

+0

啊,很高興能有所幫助。這實際上是一個巧妙的把戲:將不得不使用一段時間。 – Femi