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没有调整大小和/或给我指点我如何能够正确地做到这一点,将不胜感激。

编辑:

这是 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);
        }
    }
4

2 回答 2

1

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

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

于 2012-05-21T16:20:40.727 回答
1

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

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

您还应该在调用getWidth()之前和之后调用setWidth()。为什么?因为也许该功能正在工作并且系统确实认为宽度已经改变并且问题出在其他地方。

于 2012-05-22T09:05:34.923 回答