0

Один из моих макетов DialogFragment использует HorizontalScrollView, чтобы горизонтально прокручивать его дочерний элемент LinearLayout. Есть ли способ заблокировать его ширину на месте, чтобы он не расширил ширину диалогового окна, когда LinearLayout был заполнен элементами?Могу ли я предотвратить расширение HorizontalScrollView?

Вот что DialogFragment выглядит, когда он сначала загружает: DialogFragment - First Load

А вот то, что происходит, когда LinearLayout под заголовком кандзи заполняется предметами: DialogFramgnet - Items populated

Everything свитков тонкодисперсных однажды элементы заполнены, но я хочу, чтобы расширение DialogFragment не расширялось. Установка фиксированной ширины в корневом каталоге HorizontalScrollView помешала ему расшириться, но я не могу придумать хороший способ сделать это, учитывая при этом большой размер экранов Android.

Вот некоторый код для области под кандзи:

<HorizontalScrollView 
    android:layout_height="48dp" 
    android:layout_width="match_parent"> 

    <LinearLayout 
     android:id="@+id/grid_kanji" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" /> 

</HorizontalScrollView> 
+1

Использовать 'android: maxWidth' для определенного значения или установить его программно? Будет опубликован как ответ, но не может подтвердить прямо сейчас. –

ответ

0

я получил желаемый эффект, установив ширину HorizontalScrollView на то, что было, когда диалог первый открыл:

// Fix the size of the HorizontalScrollView so it doesn't expand 
HorizontalScrollView hsv = (HorizontalScrollView) getDialog().findViewById(R.id.grid_kanji_root); 

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, (float) hsv.getHeight(), getResources().getDisplayMetrics()); 
int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, (float) hsv.getWidth(), getResources().getDisplayMetrics()); 
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, height); 

hsv.setLayoutParams(lp); 

getWidth() и getHeight() обратные измерения в пикселях, поэтому мой TypedValue используется COMPLEX_UNIT_PX вместо COMPLEX_UNIT_DP.

Обратите внимание, что вы не можете сделать это в onCreateDialog() или onResume(), так как полученная ширина будет 0 (ноль). Я закончил работу с этим кодом в функции, которая загружает результаты курсора в дочерний элемент LinearLayout с глобальным булевым, который отслеживает, была ли я уже установлена ​​ширина - если это FALSE (как при первом загрузке диалога), тогда я установите ширину и установите значение boolean равным TRUE.

Я также обнаружил, что LayoutParams, применяемый к элементу управления, должен соответствовать типу элемента . Поскольку мой HorizontalScrollView находится внутри LinearLayout, мне пришлось применить LinearLayout.LayoutParams к нему вместо HorizontalScrollView.LayoutParams. В противном случае вы получите ClassCast Exception.

Смежные вопросы