Программное изменение размера EditText при изменении ориентации

1

Я пытаюсь программно изменить размер 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);
        }
    }
  • 0
    Вы не показываете это здесь, но, возможно, вы определили layout_width как fill_parent для EditText? Это может переопределить ваш setWidth ().
  • 0
    Хорошее предложение, к сожалению, EditText уже имеет число в качестве ширины. Обновил пост, хотя
Теги:
android-edittext
android-layout
android-orientation

2 ответа

1
Лучший ответ

Основываясь на моем собственном опыте, иногда мы склонны переубеждать причину плохого поведения. Я не раз признавал, что то, что я принимаю как должное, было не так.

Вы должны проверить, что аргумент px для этих двух случаев действительно отличается. Я знаю, что это основа, но, возможно, applyDimension работает не так, как вы ожидаете, или есть какая-то минимальная ширина, определенная в другом месте, и вы просто попали в нее.

Вы также должны вызвать getWidth() до и после вызова setWidth(). Зачем? потому что, возможно, функция работает, и система действительно думает, что ширина haschanged и проблема лежит в другом месте.

  • 0
    Спасибо за ваше понимание, это заставило меня взглянуть на мой код по-другому и в конечном итоге привело меня к решению (которое заключалось в использовании LayoutParams вместо input.setWidth() ). Я обновил свой пост с рабочим кодом.
1

Я не совсем уверен, почему размер не изменяется программно, однако вы можете вместо этого использовать другой файл макета для ландшафтного режима. Просто создайте новую папку под названием "layout-land" и поместите туда свой файл layout.xml (с теми же идентификаторами и именами файлов) и соответствующим образом измените размеры.

Возможно, это не лучшее решение в зависимости от вашего случая, но это просто еще один вариант...

  • 0
    Спасибо за ваш ответ. Я пробовал это, но если у меня есть следующая строка в моем манифесте, он просто не будет использовать макет, который находится в папке layout-land. Он просто будет использовать макет, который уже отображается как для портрета, так и для пейзажа. android:configChanges="keyboardHidden|orientation" меня есть другой класс, который не использует эту строку, и папка layout-land прекрасно работает для этого

Ещё вопросы

Сообщество Overcoder
Наверх
Меню