2012-10-17 97 views
11

我想按如下格式顯示6張圖像。Android GridVIew根據方向更改列數

在縱向,2個coumns,3列,並在landscare方向3列 ,2行

使用Android電子GridView和在佈局端口和佈局,土地目錄定義不同的網格佈局

我能達到這個效果。

後來按我要求的活動,我加入的manifest.xml一個參

android:configChanges = "mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|fontScale|screenSize"` 

停止我的活動重新一旦屏幕方向的變化。

添加此參數後,我的網格視圖不按預期方式運行。它有時顯示1列,有時顯示2列,有時顯示3列。

我根據設備的方向在我的網格適配器的get view方法中放置gridView.setNumberOfColumns(2)gridView.setNumberOfColumns(3)方法。

請幫我實現這個效果,而不在的Manifest.xml去除android:configChanges參數

回答

1

當你使用Android:在清單中的活動configChanges =「方向」不會重新對方向變化(橫向到縱向或副反之亦然)。如果你不想從清單中刪除這個標籤,你必須重寫onConfigchanged並在那裏放置一些代碼邏輯。

2
@Override 
    public void onConfigurationChanged(Configuration newConfig) { 

     super.onConfigurationChanged(newConfig); 
     if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 
      setContentView(R.layout.lay_vertical); 
     } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
      setContentView(R.layout.lay_horizontal); 
     } 

    }; 

然後根據您的需要再次在gridview中加載數據。

將清單中該活動節點的android:configChanges =「orientation」。

+0

你會得到例外,因爲'setContentView'可以被稱爲只有一次。 – Jin35

+0

我不這麼認爲,setcontentview只能被調用一次,而是所有的特定佈局中的東西都必須通過findViewById對它進行重新初始化,並且它會變得平滑 –

9
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    grid.setNumColumns(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2); 
    super.onConfigurationChanged(newConfig); 
} 
35

使用強大的資源系統。

在XML佈局,設置列數爲整數的資源,然後在/values/integers.xml它設置爲2,肖像和/values-land/integers.xml其設置爲3景觀

//好了,如果你在configChanges艙單,你將不得不從Java中onConfogurationChanged

更改列數
+0

謝謝。無論如何,現在它只是縱向模式的'values-land'和'values',無論如何+1。 – Niklas

+1

我認爲它應該是'values-land'和'values-port'(而不是純粹的'values'),以便與各種設備更好地兼容。 – defhlt

6

您可以編程方式使用

float scalefactor = getResources().getDisplayMetrics().density * 100; 
int number = getWindowManager().getDefaultDisplay().getWidth(); 
int columns = (int) ((float) number/(float) scalefactor); 
gridView.setNumColumns(columns); 
+0

getDefaultDisplay()。getWidth()現在已棄用。有沒有其他的方法來獲得它? – Ody

3

我的解決方案設置的列數:

值/ dimens.xml:

<resources> 
    <dimen name="grip_view_entry_size">160dp</dimen> 
    <dimen name="grip_view_spacing">10dp</dimen> 
</resources> 

佈局/ gridview的。XML

<GridView android:id="@+id/android:list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:numColumns="auto_fit" 
    android:verticalSpacing="@dimen/grip_view_spacing" 
    android:horizontalSpacing="@dimen/grip_view_spacing" 
    android:stretchMode="columnWidth" 
    android:gravity="center" 
    android:scrollingCache="false" 
    android:fastScrollEnabled="true" 
    android:animationCache="false"/> 

在您的片段:

private void refreshGridView() { 

    int gridViewEntrySize = getResources().getDimensionPixelSize(R.dimen.grip_view_entry_size); 
    int gridViewSpacing = getResources().getDimensionPixelSize(R.dimen.grip_view_spacing); 

    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 

    int numColumns = (display.getWidth() - gridViewSpacing)/(gridViewEntrySize + gridViewSpacing); 

    gridView.setNumColumns(numColumns); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    refreshGridView(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    refreshGridView(); 
} 
+1

這工作,應該被接受爲正確的答案 – Jaky71

0

我做了屏幕尺寸爲主,不DPI

public static int getGridColumnsCount(Context context){ 
    boolean landscape = context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; 

    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); 
    float hi=displayMetrics.heightPixels/displayMetrics.xdpi; 
    float wi=displayMetrics.widthPixels/displayMetrics.ydpi; 
    float screenWidthInch = landscape ? Math.max(wi, hi) : Math.min(wi, hi); 
    float screenWidthCm = screenWidthInch * 2.54f; 
    int columns = (int)(screenWidthCm/2); 
    return columns < 3 ? 3 : columns; 
}