Обновление numColumns в GridView на основе изменения ориентации [duplicate]

Жадный означает, что ваше выражение будет соответствовать как можно большей группе, ленивое означает, что оно будет соответствовать самой маленькой группе. Для этой строки:

abcdefghijklmc

и это выражение:

a.*c

Жадное соответствие будет соответствовать всей строке, а ленивое соответствие будет соответствовать только первому abc.

14
задан Ken Redler 17 October 2012 в 06:06
поделиться

7 ответов

Мое решение:

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();
}
4
ответ дан almisoft 28 August 2018 в 07:45
поделиться
    @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 = "ориентация" для этого узла активности в манифесте.

2
ответ дан Amit Hooda 28 August 2018 в 07:45
поделиться
@Override
public void onConfigurationChanged(Configuration newConfig) {
    grid.setNumColumns(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2);
    super.onConfigurationChanged(newConfig);
}
10
ответ дан Jin35 28 August 2018 в 07:45
поделиться

я сделал его на основе размера экрана, но не 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;
}
1
ответ дан John 28 August 2018 в 07:45
поделиться

Пока вы используете android: configChanges = «ориентация» в манифесте, ваша активность не воссоздается при изменении ориентации («Пейзаж для портрета» или наоборот). Если вы не хотите удалять этот тег из манифеста, вам необходимо переопределить onConfigchanged и поместить туда некоторую логику кода.

1
ответ дан Krishnakant Dalal 28 August 2018 в 07:45
поделиться

вы можете программно установить число столбцов, используя

float scalefactor = getResources().getDisplayMetrics().density * 100;
int number = getWindowManager().getDefaultDisplay().getWidth();
int columns = (int) ((float) number / (float) scalefactor);
gridView.setNumColumns(columns);
7
ответ дан Pratik Butani 28 August 2018 в 07:45
поделиться

Использовать мощную систему ресурсов.

В макете xml задайте количество столбцов для целочисленного ресурса, а затем в /values/integers.xml установите для него 2 для портрета и в /values-land/integers.xml установите для него значение 3 для пейзажа

// хорошо, если вы выполняете configChanges в манифесте, вам нужно будет изменить количество столбцов из java в onConfogurationChanged

36
ответ дан urSus 28 August 2018 в 07:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: