Я пытаюсь программно изменить размер EditText
когда меняется ориентация телефона, вот что я до сих пор:
private final float editTextWidthLandscap = 380;
private final float editTextWidthPortrait = 220;
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Resources r = getResources();
float px;
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, editTextWidthLandscap, r.getDisplayMetrics());
input.setWidth((int) px); // input is an EditText
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, editTextWidthPortrait, r.getDisplayMetrics());
input.setWidth((int) px); // input is an EditText
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
У меня также есть это в моем файле манифеста (в случае, если это имеет значение):
<activity
android:name=".Results"
android:configChanges="keyboardHidden|orientation"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateHidden" >
</activity>
Странно то, что он отображает Toast
просто отлично, но, похоже, игнорирует input.setWidth()
. Если бы кто-нибудь мог объяснить, почему EditText
не изменяется и/или не дает мне указаний относительно того, как я мог бы это сделать правильно, было бы весьма полезно.
Редактировать:
Это часть XML файла, в котором находится EditText
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="80dp"
android:background="@color/purple"
android:gravity="center_horizontal|center_vertical"
android:orientation="horizontal" >
<EditText
android:id="@+id/input"
android:layout_width="220dp"
android:layout_height="50dp"
android:background="@drawable/search_bar"
android:hint="@string/input_hint"
android:inputType="text|textNoSuggestions"
android:maxLines="1"
android:minHeight="50dp"
android:minWidth="220dp"
android:selectAllOnFocus="true"
android:singleLine="true"
android:textColor="@color/black_grey"
android:textSize="16.67sp" />
<Button
android:id="@+id/search_button"
android:layout_width="65dp"
android:layout_height="50dp"
android:background="@drawable/search_button" />
</LinearLayout>
Изменить 2: (решение)
Я до сих пор не знаю, что input.setWidth()
, но я узнал, что мне пришлось использовать LayoutParams
для этой проблемы. Ниже приведен код, который работает для меня сейчас:
private final float editTextWidthLandscap = 380;
private final float editTextWidthPortrait = 220;
private final float editTextHeight = 50;
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Resources r = getResources();
float widthpx;
float heightpx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, editTextHeight, r.getDisplayMetrics());;
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
widthpx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, editTextWidthLandscap, r.getDisplayMetrics());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams((int) Math.round(widthpx), (int) Math.round(heightpx));
trademarkTextfield.setLayoutParams(lp);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
widthpx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, editTextWidthPortrait, r.getDisplayMetrics());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams((int) Math.round(widthpx), (int) Math.round(heightpx));
trademarkTextfield.setLayoutParams(lp);
}
}
Основываясь на моем собственном опыте, иногда мы склонны переубеждать причину плохого поведения. Я не раз признавал, что то, что я принимаю как должное, было не так.
Вы должны проверить, что аргумент px для этих двух случаев действительно отличается. Я знаю, что это основа, но, возможно, applyDimension
работает не так, как вы ожидаете, или есть какая-то минимальная ширина, определенная в другом месте, и вы просто попали в нее.
Вы также должны вызвать getWidth()
до и после вызова setWidth()
. Зачем? потому что, возможно, функция работает, и система действительно думает, что ширина haschanged и проблема лежит в другом месте.
LayoutParams
вместо input.setWidth()
). Я обновил свой пост с рабочим кодом.
Я не совсем уверен, почему размер не изменяется программно, однако вы можете вместо этого использовать другой файл макета для ландшафтного режима. Просто создайте новую папку под названием "layout-land" и поместите туда свой файл layout.xml (с теми же идентификаторами и именами файлов) и соответствующим образом измените размеры.
Возможно, это не лучшее решение в зависимости от вашего случая, но это просто еще один вариант...
android:configChanges="keyboardHidden|orientation"
меня есть другой класс, который не использует эту строку, и папка layout-land прекрасно работает для этого