Жадный означает, что ваше выражение будет соответствовать как можно большей группе, ленивое означает, что оно будет соответствовать самой маленькой группе. Для этой строки:
abcdefghijklmc
и это выражение:
a.*c
Жадное соответствие будет соответствовать всей строке, а ленивое соответствие будет соответствовать только первому abc
.
Мое решение:
values / 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"/>
в вашем фрагменте:
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();
}
@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 в соответствии с вашими потребностями.
Поместите андроид: configChanges = "ориентация" для этого узла активности в манифесте.
@Override
public void onConfigurationChanged(Configuration newConfig) {
grid.setNumColumns(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2);
super.onConfigurationChanged(newConfig);
}
я сделал его на основе размера экрана, но не 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;
}
Пока вы используете android: configChanges = «ориентация» в манифесте, ваша активность не воссоздается при изменении ориентации («Пейзаж для портрета» или наоборот). Если вы не хотите удалять этот тег из манифеста, вам необходимо переопределить onConfigchanged и поместить туда некоторую логику кода.
вы можете программно установить число столбцов, используя
float scalefactor = getResources().getDisplayMetrics().density * 100;
int number = getWindowManager().getDefaultDisplay().getWidth();
int columns = (int) ((float) number / (float) scalefactor);
gridView.setNumColumns(columns);
Использовать мощную систему ресурсов.
В макете xml задайте количество столбцов для целочисленного ресурса, а затем в /values/integers.xml
установите для него 2 для портрета и в /values-land/integers.xml
установите для него значение 3 для пейзажа
// хорошо, если вы выполняете configChanges в манифесте, вам нужно будет изменить количество столбцов из java в onConfogurationChanged