在方向更改时以编程方式调整EditText的大小

时间:2012-05-21 15:50:57

标签: android android-layout android-edittext android-orientation

我正在尝试以编程方式调整手机方向发生变化时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没有被调整大小和/或给我指示我将如何能够正确地做到这一点,那将非常感激。

修改

这是EditText所在的XML文件的一部分

    <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);
        }
    }

2 个答案:

答案 0 :(得分:1)

我不确定为什么大小不会以编程方式更改,但是,您可能希望为横向模式使用不同的布局文件。只需创建一个名为“layout-land”的新文件夹,并将layout.xml文件放在那里(使用相同的ID和文件名)并相应地更改大小。

根据您的情况,这可能不是最佳解决方案,但它只是另一种选择......

答案 1 :(得分:1)

根据我自己的经验,有时我们倾向于过度思考不良行为的原因。我不止一次地发现那些我认为理所当然的事情并非如此。

您应该检查两种情况的px参数是否真的不同。我知道这是一个基础知识,但是applyDimension可能没有按照你期望的方式工作,或者在其他地方定义了一些最小宽度,你只需点击它。

您还应在致电getWidth()之前和之后致电setWidth()。为什么?因为可能功能正常,系统确实认为宽度已经改变,问题出在其他地方。