Автоматическая подгонка в соответствии с размером экрана в макете
Я создал сетку, содержащую полные тексты. Я хочу, чтобы текст автоматически устанавливался в соответствии с размером экрана. Я пробовал следующий код,
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
int noOfColumns = (int) (dpWidth / 50);
return noOfColumns;
Я хочу вывести что-то вроде этого
] 2
Это не работает в соответствии с моей потребностью. Пожалуйста помоги. Заранее спасибо.
Ответы
Ответ 1
Здесь пользовательская реализация GridLayout, которая будет делать то, что вам нужно: AutoGridLayout
public class AutoGridLayout extends GridLayout {
private int defaultColumnCount;
private int columnWidth;
public AutoGridLayout(Context context) {
super(context);
init(null, 0);
}
public AutoGridLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}
public AutoGridLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs, defStyleAttr);
}
private void init(AttributeSet attrs, int defStyleAttr) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.AutoGridLayout, 0, defStyleAttr);
try {
columnWidth = a.getDimensionPixelSize(R.styleable.AutoGridLayout_columnWidth, 0);
int[] set = { android.R.attr.columnCount /* id 0 */ };
a = getContext().obtainStyledAttributes(attrs, set, 0, defStyleAttr);
defaultColumnCount = a.getInt(0, 10);
} finally {
a.recycle();
}
/* Initially set columnCount to 1, will be changed automatically later. */
setColumnCount(1);
}
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
super.onMeasure(widthSpec, heightSpec);
int width = MeasureSpec.getSize(widthSpec);
if (columnWidth > 0 && width > 0) {
int totalSpace = width - getPaddingRight() - getPaddingLeft();
int columnCount = Math.max(1, totalSpace / columnWidth);
setColumnCount(columnCount);
} else {
setColumnCount(defaultColumnCount);
}
}
}
Просто добавьте в свой XML-макет файл следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.km.myproject.customview.AutoGridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="5"
app:columnWidth="50dp"/>
</FrameLayout>
Использование columnWidth
будет пытаться подсчитать, сколько столбцов может поместиться, и автоматически установить оптимальный счетчик пробега. Если не используется (или не удалось измерить по какой-либо причине), будет использоваться атрибут columnCount
.
Надеюсь это поможет!
Ответ 2
Для gridlayout
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:columnCount="4"
android:orientation="horizontal" >
<Button android:text="1" />
<Button android:text="2" />
<Button android:text="3" />
<Button android:text="4" />
<Button android:text="5" />
<Button android:text="6" />
<Button android:text="7" />
<Button android:text="8" />
<Button android:text="9" />
<Button android:text="10" />
<Button android:text="11" />
<Button android:text="12" />
<Button android:text="13" />
<Button android:text="14" />
<Button android:text="15" />
<Button android:text="16" />
</GridLayout>
программно:
GridLayout gridLayout = new GridLayout(this);
gridLayout .setColumnCount(4);
///...
пример: fooobar.com/questions/181059/...
для настройки gridview используйте этот метод:
private void adjustGridView() {
gv.setNumColumns(GridView.AUTO_FIT);
gv.setColumnWidth(70);
}
Ответ 3
Сделайте следующее;
-
Используйте свой код для вычисления количества столбцов в onCreate или onCreateView. Учитывайте расстояние между столбцами.
-
Вызов setColumnCount на GridLayout с указанным выше счетчиком
-
В xml добавьте атрибут android:layout_columnWeight="1"
ко всем элементам в GridLayout. Это приведет к расширению столбцов в API 21 и выше.
-
В pre API 21 вы можете либо горизонтально центрировать GridView, чтобы он выглядел прилично. Или еще лучше вычислить предпочтительную ширину столбца (gridWidth/columnCount) и выполнить итерацию всех элементов в сетке (ViewGroup) и установить их ширину в столбце Ширина.
Ответ 4
Было бы сложно сделать GridLayout
делать то, что вам нужно:
-
Несмотря на то, что вы можете прочитать ширину экрана из DisplayMetrics
, этот метод будет несовместим с новыми версиями Android, поддерживающими разделенный экран. Вам нужна ширина родительского представления, а не весь экран.
-
Даже если предположить, что показатели отображения дают вам надежную ширину для окна, отображающего вашу активность, эта логика будет разорваться, как только вы поместите макет в фрагмент рядом с другим фрагментом. Не имеет смысла создавать что-то настолько негибкое.
-
Ширина родительского представления неизвестна до завершения макета. Это не делает невозможным использование, просто сложно.
Простая вещь, которую нужно сделать, это использовать GridView
который лучше разработан для этой цели, потому что у него есть опция autofit
для количества столбцов.