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

私自身の経験に基づいて、私たちは時々悪い行動の理由を考えすぎる傾向があります。当たり前のことはそうではないことに何度も気づきました。

2つのケースのpx引数が実際に異なることを確認する必要があります。これが基本であることは知っていapplyDimensionますが、期待どおりに機能していないか、他の場所で最小幅が定義されていて、それをヒットしただけかもしれません。

getWidth()また、への呼び出しの前後に呼び出す必要がありますsetWidth()。なんで?関数が機能していて、システムが幅が変更されたと見なし、問題が他の場所にある可能性があるためです。

于 2012-05-22T09:05:34.923 に答える