【问题标题】:Is it possible to change the layout width and height in Android at run time?是否可以在运行时更改 Android 中的布局宽度和高度?
【发布时间】:2011-03-01 06:02:02
【问题描述】:

我有两个相对布局。两者都具有填充父级的宽度和 100 倾角的高度。我的要求是当我单击第一个布局时,它应该缩小到 50dip 高度,而另一个扩展到 150dip 高度。这样做时我遇到了异常。请帮助我如何在运行时更改布局宽度和高度。

    final LinearLayout RLChange = new LinearLayout(this);        
    RLChange.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                             LayoutParams.FILL_PARENT)); 
    RLChange.setOrientation(LinearLayout.VERTICAL);

    final LinearLayout RLGreen = new LinearLayout(this);        
    RLGreen.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                             300));
    RLGreen.setBackgroundColor(Color.GREEN);
    RLGreen.setOrientation(LinearLayout.HORIZONTAL);

    Button btnClick = new Button(this);        
    btnClick.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));
    btnClick.setBackgroundColor(Color.RED);

    RLGreen.addView(btnClick);


    final LinearLayout RLYellow = new LinearLayout(this);        
    RLYellow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                             200));
    RLYellow.setBackgroundColor(Color.YELLOW);


    btnClick.setOnClickListener(new View.OnClickListener() {            
        public void onClick(View view) {  
                    Toast.makeText(getApplicationContext(), "click", Toast.LENGTH_SHORT).show();
                    RLGreen.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                            LayoutParams.FILL_PARENT));  
        }
     });  

    RLChange.addView(RLGreen);
    RLChange.addView(RLYellow);
    setContentView(RLChange);




Log Cat


03-10 11:01:35.328: INFO/NotificationService(574): enqueueToast pkg=Changewidth.com callback=android.app.ITransientNotification$Stub$Proxy@43948648 duration=0
03-10 11:01:35.388: DEBUG/AndroidRuntime(1505): Shutting down VM
03-10 11:01:35.388: WARN/dalvikvm(1505): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
03-10 11:01:35.398: ERROR/AndroidRuntime(1505): Uncaught handler: thread main exiting due to uncaught exception
03-10 11:01:35.449: ERROR/AndroidRuntime(1505): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:326)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.view.View.measure(View.java:7703)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.view.View.measure(View.java:7703)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:464)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.view.View.measure(View.java:7703)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.view.View.measure(View.java:7703)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.view.ViewRoot.performTraversals(ViewRoot.java:747)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1613)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.os.Looper.loop(Looper.java:123)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at android.app.ActivityThread.main(ActivityThread.java:4203)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at java.lang.reflect.Method.invokeNative(Native Method)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at java.lang.reflect.Method.invoke(Method.java:521)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):     at dalvik.system.NativeStart.main(Native Method)
03-10 11:01:35.479: INFO/Process(574): Sending signal. PID: 1505 SIG: 3
03-10 11:01:35.479: INFO/dalvikvm(1505): threadid=7: reacting to signal 3
03-10 11:01:35.619: INFO/dalvikvm(1505): Wrote stack trace to '/data/anr/traces.txt'
03-10 11:01:35.779: DEBUG/dalvikvm(623): GC freed 3557 objects / 196272 bytes in 448ms

【问题讨论】:

    标签: android


    【解决方案1】:

    在 onClick Listener 中添加此代码。

    Button button = (Button) findViewById(view.getId());
    LinearLayout rLGreen = ((LinearLayout) button.getParent());
    rLGreen.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    

    它会起作用的。

    【讨论】:

      【解决方案2】:

      您好,您可以使用此代码更改布局的宽度和高度。

      RelativeLayout.LayoutParams parms = new RelativeLayout.LayoutParams(width,height);
      RelativeLayout layout1 = (RelativeLayout) findViewById(R.id.layout1);
      lauout1.setLayoutParams(parms);
      

      【讨论】:

      • 但是当我在运行时更改布局参数时应用程序崩溃:(
      • 与你上面提到的代码相同。但是当我在运行时更改宽度时,应用程序崩溃
      • 请调试代码并检查是哪一行错误出现并共享堆栈跟踪。
      • 嗨..请告诉我如何在此处添加代码。我找不到办法做到这一点
      • 编辑你的问题并输入代码(检查工具栏选项“{}”)。
      【解决方案3】:

      这些为这个视图的父级提供参数,指定它应该如何排列。 ViewGroup.LayoutParams的子类有很多,分别对应ViewGroup的不同子类,负责安排子类。

      因此,基本上,如果您要向另一个视图添加视图,则必须将视图的 LayoutParams 设置为父级使用的 LayoutParams 类型,否则您将收到运行时错误。

      【讨论】:

        【解决方案4】:

        您是否为特定视图使用了正确的 LayoutParams 类?尝试使用 LinearLayout.LayoutParams。

        【讨论】:

          【解决方案5】:

          请记住,LayoutParams 由 Parent(父视图组)使用,以确定如何布局此视图。

          例如,如果您有以下情况

          LinearLayout
              RelativeLayout1
              RelativeLayout2
          

          而你想改变RelativeLayout1或RelativeLayout2的宽度或高度, 那么你需要做这样的事情。

          LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 200);
          //Get handle to RelativeLayout1 assuming it is R1, you would call
          R1.setLayoutParams(lp);
          

          你也需要做同样的事情来改变 RelativeLayout2 的 LayoutParams。

          很容易忘记层次结构,并假设您需要设置子级的布局,但决定支持哪些属性的是父级(例如对齐,或重力等)。

          希望这会有所帮助。已经烧了我好几次了....

          【讨论】:

            猜你喜欢
            • 2012-08-17
            • 2015-03-14
            • 2015-03-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-17
            • 2013-02-16
            相关资源
            最近更新 更多