2012-10-17 21 views
11

Desidero visualizzare 6 immagini sotto forma di griglia come segue.Android GridVIew Modifica il numero di colonne in base all'orientamento

orientamento verticale, 2 coumns, 3 righe e in landscare orientamento 3 colonne, 2 righe

Utilizzando GridView Android e definendo diversi layout griglia nel layout porte e la layout-terra directory ho potuto raggiungere questo effetto.

tardi come per il mio requisito di attività, ho aggiunto un parametro in manifest.xml cioè

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

per fermare la mia attività di ricreare una volta i cambiamenti di orientamento dello schermo.

Dopo aver aggiunto questo parametro, la mia vista griglia non si comporta in modo previsto. Talvolta mostra 1 colonna, a volte 2 colonne e talvolta 3 colonne.

Sto posizionando i metodi gridView.setNumberOfColumns(2) o gridView.setNumberOfColumns(3) nel metodo di visualizzazione get del mio adattatore di rete in base all'orientamento del dispositivo.

Please help me per ottenere questo effetto senza rimuovere il parametro android:configChanges in manifest.XML

risposta

1

Mentre si utilizza Android: configChanges = "orientamento" nel manifestare la vostra attività non ricreare sull'orientamento cambiato (orizzontale a verticale o viceversa versa). Se non si desidera rimuovere questo tag da manifest, è necessario eseguire l'override di onConfigchanged e inserire lì la logica del codice.

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); 
     } 

    }; 

Quindi caricare nuovamente i dati in griglia in base alle proprie esigenze.

Metti android: configChanges = "orientation" per quel nodo attività nel manifest.

+0

Si otterrà un'eccezione, perché 'setContentView' può essere chiamato solo una volta. – Jin35

+0

Non penso che setcontentview possa essere chiamato una sola volta, invece tutte le cose in quel particolare layout dovranno essere reinizializzate con le cose al suo interno da findViewById e andrà liscio –

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

Utilizzare il potente sistema di risorse.

Nel layout xml, impostare il numero di colonne per una risorsa intero e poi nel /values/integers.xml impostarlo su 2 per il ritratto e in /values-land/integers.xml impostarlo su 3 per il paesaggio

// bene, se lo fai in configChanges manifesti, si dovrà cambiare numero di colonne da Java in onConfogurationChanged

+0

Grazie amico. Ora è 'values-land' e solo' values' per la modalità portrait, comunque +1. – Niklas

+1

Penso che dovrebbe essere 'values-land' e' values-port' (invece di 'valori') per una migliore compatibilità con vari dispositivi. – defhlt

6

è possibile impostare il numero di colonne programatically usando

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

getDefaultDisplay(). GetWidth() è ora deprecato. C'è un altro modo per ottenerlo? – Ody

3

La mia soluzione:

012.

valori/dimens.xml:

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

layout/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"/> 

nel frammento:

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

ha funzionato e dovrebbe essere accettato come risposta corretta – Jaky71

0

ho fatta based dimensione dello schermo, non 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; 
} 
Problemi correlati