我正在尝试以编程方式调整手机方向发生变化时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);
}
}
答案 0 :(得分:1)
我不确定为什么大小不会以编程方式更改,但是,您可能希望为横向模式使用不同的布局文件。只需创建一个名为“layout-land”的新文件夹,并将layout.xml文件放在那里(使用相同的ID和文件名)并相应地更改大小。
根据您的情况,这可能不是最佳解决方案,但它只是另一种选择......
答案 1 :(得分:1)
根据我自己的经验,有时我们倾向于过度思考不良行为的原因。我不止一次地发现那些我认为理所当然的事情并非如此。
您应该检查两种情况的px参数是否真的不同。我知道这是一个基础知识,但是applyDimension
可能没有按照你期望的方式工作,或者在其他地方定义了一些最小宽度,你只需点击它。
您还应在致电getWidth()
之前和之后致电setWidth()
。为什么?因为可能功能正常,系统确实认为宽度已经改变,问题出在其他地方。