-2

ビューの高さと幅を変更したい(ボタンビュー、画像ビュー、リニアレイアウト、フレームレイアウト、またはあらゆる種類のビューである可能性があります)。メソッド traverseRootViewAndSetLayoutParam(View, double , double) を使用して、これを変更します。これらの行にコメントすると機能します。

    if (view.getClass().equals(LinearLayout.class)) {
         LinearLayout.LayoutParams layoutParams = new
         LinearLayout.LayoutParams(
         (int) (((double) widthRatio) * (view.getWidth())),
         (int) (((double) heightRatio) * (view.getHeight())));
         view.setLayoutParams(layoutParams);
    } else if (view.getClass().equals(FrameLayout.class)) {
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
                (int) (((double) widthRatio) * (view.getWidth())),
                (int) (((double) heightRatio) * (view.getHeight())));
        view.setLayoutParams(layoutParams);
    }

、しかし、onCreate()メソッドでClassCastExceptionを取得しているよりもすべてのコードを実行すると、

コードをデバッグすると、メソッド traverseRootViewAndSetLayoutParam(View, double , double) で例外が発生しませんが、制御が onCreate() を通過した後、ClassCastException が発生します。コントロールがオンラインになることを確認します System.outprintln(>> oncreate end >>)。現時点ではエラーは発生していませんが、oncreate メソッドの例外が発生します。

onCreateメソッドで呼び出しているコード行、

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            ...
            ...
            ...
    try {
        traverseRootViewAndSetLayoutParam(rootLinearLayout, widthRatio,
                heightRatio);
    } catch (Exception e) {
        e.printStackTrace();
    }
System.out.println(">>> oncreate end >>> ");
   }

traverseRootViewAndSetLayoutParam() メソッド、

public void traverseRootViewAndSetLayoutParam(View view,
        double heightRatio, double widthRatio) {

    System.out.println(">>> iCount >>> " + iCount++);

    if (view.getClass().equals(LinearLayout.class)) {
         LinearLayout.LayoutParams layoutParams = new
         LinearLayout.LayoutParams(
         (int) (((double) widthRatio) * (view.getWidth())),
         (int) (((double) heightRatio) * (view.getHeight())));
         view.setLayoutParams(layoutParams);
    } else if (view.getClass().equals(FrameLayout.class)) {
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
                (int) (((double) widthRatio) * (view.getWidth())),
                (int) (((double) heightRatio) * (view.getHeight())));
        view.setLayoutParams(layoutParams);
    }
    // else {
    // ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
    // (int) (((double) widthRatio) * (view.getWidth())),
    // (int) (((double) heightRatio) * (view.getHeight())));
    // view.setLayoutParams(layoutParams);
    // }

    if (view instanceof LinearLayout || view instanceof FrameLayout) {
        if (view instanceof LinearLayout) {
            System.out.println(">>> LinearLayout Class >>> "
                    + view.getClass());
            int childcount = ((LinearLayout) view).getChildCount();
            for (int i = 0; i < childcount; i++) {
                View childView = ((LinearLayout) view).getChildAt(i);
                traverseRootViewAndSetLayoutParam(childView, heightRatio,
                        widthRatio);
            }
        } else if (view instanceof FrameLayout) {
            System.out.println(">>> FrameLayout Class >>> "
                    + view.getClass());
            int childcount = ((FrameLayout) view).getChildCount();
            for (int i = 0; i < childcount; i++) {
                View childView = ((FrameLayout) view).getChildAt(i);
                traverseRootViewAndSetLayoutParam(childView, heightRatio,
                        widthRatio);
            }
        }
    }
}

エラーログ、

12-16 00:30:12.791: W/dalvikvm(277): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
12-16 00:30:12.952: E/AndroidRuntime(277): FATAL EXCEPTION: main
12-16 00:30:12.952: E/AndroidRuntime(277): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:355)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.View.measure(View.java:8171)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:696)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:306)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.View.measure(View.java:8171)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.View.measure(View.java:8171)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.View.measure(View.java:8171)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.View.measure(View.java:8171)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.View.measure(View.java:8171)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.os.Looper.loop(Looper.java:123)
12-16 00:30:12.952: E/AndroidRuntime(277):  at android.app.ActivityThread.main(ActivityThread.java:4627)
12-16 00:30:12.952: E/AndroidRuntime(277):  at java.lang.reflect.Method.invokeNative(Native Method)
12-16 00:30:12.952: E/AndroidRuntime(277):  at java.lang.reflect.Method.invoke(Method.java:521)
12-16 00:30:12.952: E/AndroidRuntime(277):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-16 00:30:12.952: E/AndroidRuntime(277):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-16 00:30:12.952: E/AndroidRuntime(277):  at dalvik.system.NativeStart.main(Native Method)
12-16 00:30:42.751: I/Process(277): Sending signal. PID: 277 SIG: 9
4

2 に答える 2

3

LayoutParams は常に親ビュー グループに対して相対的であるため、この例外が発生します。

たとえば、RelativeLayout があり、この RelativeLayout 内に LinearLayout がある場合、この LinearLayout の LayoutParams は RelativeLayout.LayoutParams になります。

これは、これらのパラメーターが、親がその領域内でそのビューをレイアウトする方法に関連しているためです。

于 2012-12-15T19:24:15.350 に答える
1
if (view.getClass().equals(LinearLayout.class)) {
     LinearLayout.LayoutParams layoutParams = new
     LinearLayout.LayoutParams(
     (int) (((double) widthRatio) * (view.getWidth())),
     (int) (((double) heightRatio) * (view.getHeight())));
     view.setLayoutParams(layoutParams);
} else if (view.getClass().equals(FrameLayout.class)) {
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
            (int) (((double) widthRatio) * (view.getWidth())),
            (int) (((double) heightRatio) * (view.getHeight())));
    view.setLayoutParams(layoutParams);
}

ここでは、ビューの親ではなく、ビューのタイプをチェックしています。ビューの親が でLinearLayout、ビュー自体が のFrameLayout場合、 を与えることになりますがFrameLayout.LayoutParams、これは正しくありません。

ウェイトやレイアウト タイプ固有のものを使用していないので、次のように使用することをお勧めしViewGroup.LayoutParamsます。

ViewGroup.LayoutParams layoutParams = new
ViewGroup.LayoutParams(
    (int) (((double) widthRatio) * (view.getWidth())),
    (int) (((double) heightRatio) * (view.getHeight())));
view.setLayoutParams(layoutParams);
于 2012-12-15T19:23:16.450 に答える